多线程
5 线程状态
5.3 线程礼让
- Thread.yield()
- 礼让线程,让当前正在执行的线程暂停,但不阻塞
- 将线程从运行状态转为就绪状态
- 让CPU重新调度,礼让不一定成功!由CPU调度决定。
package com.duo.state;
//测试礼让线程
public class YieldTest {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield, "a").start();
new Thread(myYield, "b").start();
}
}
class MyYield implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程开始执行");
Thread.yield(); //线程礼让
System.out.println(Thread.currentThread().getName() + "线程停止执行");
}
}
运行结果:
如上所示,原本a线程应当会相继输出"a线程开始执行"和"a线程停止执行",由于线程礼让,在执行完System.out.println(Thread.currentThread().getName() + "线程开始执行");
之后,a线程礼让,b线程开启;同理,在b线程执行完相同语句时,b线程礼让,a线程继续执行。
当注释掉Thread.yield();
之后,运行结果:
但实际上每次的运行结果是不同的,主要还是“看CPU心情”!例如同样是未加礼让,就出现了如下所示的运行结果:
5.4 线程强制执行
- Join合并线程,待此线程执行完成之后,再执行其他线程,其他线程阻塞
- 可以类比插队
package com.duo.state;
//测试join方法
public class JoinTest implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程VIP来了" + i);
}
}
public static void main(String[] args) throws InterruptedException {
JoinTest joinTest = new JoinTest();
Thread thread = new Thread(joinTest);
thread.start();
//主线程
for (int i = 0; i < 500; i++) {
if (i == 200) {
thread.join();
}
System.out.println("main" + i);
}
}
}
运行结果(部分截取):
可以发现,主线程中,只有当i在达到200之后才会接着之前“插队”的VIP线程继续执行。