多线程
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 {@Overridepublic 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 {@Overridepublic 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线程继续执行。