多线程(七)yield(线程礼让)和join(线程强制执行)
作者:互联网
线程礼让–yield
- 礼让线程,让当前正在执行的线程暂停,但不堵塞
- 将线程从运行状态转为就绪状态
- 让CPU重新调度,礼让不一定成功!看CPU心情
举例
- 堵塞是运动员摔倒了,需要恢复完再进行比赛
- 而就绪状态指的是运动员准备跑了
- 运行状态,运动员在奔跑中
- 线程执行了yield,就是让当前处于运行状态的线程暂停,但不阻塞,就是指让奔跑的运动员停下来,然后重新跑
/**
* 测试礼让线程
* 礼让不一定成功,看cpu心情
*
* @author LCW
* @since 2020/11/9 19:54
**/
public class TestYield {
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线程停止执行
b线程开始执行
b线程停止执行
线程强制执行–join
- Join合并线程,待线程执行完成后,再执行其他线程,其他线程堵塞
- 就是当线程 执行jojn方法,那么此线程就优先执行,而正在执行的其他线程进入堵塞状态
- 可以想象成插对
/**
* 测试join方法--线程强制执行
* 想象为插队
*
* @author LCW
* @since 2020/11/9 20:01
**/
public class TestJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("线程vip来了" + i);
}
}
public static void main(String[] args) {
//启动我们的线程
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
//主线程
for (int i = 0; i < 300; i++) {
if (i == 200) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程" + i);
}
}
}
开始的时候一起执行,当thread.join执行后,线程优先执行,主线程处于堵塞状态,待线程执行完毕后,主线程才继续执行。
主线程195
主线程196
主线程197
主线程198
主线程199
线程vip来了262
线程vip来了263
线程vip来了264
线程vip来了265
线程vip来了266
线程vip来了267
线程vip来了268
......
线程vip来了995
线程vip来了996
线程vip来了997
线程vip来了998
线程vip来了999
主线程200
主线程201
主线程202
主线程203
主线程204
主线程205
主线程206
主线程207
主线程208
标签:执行,join,Thread,主线,vip,线程,多线程,礼让 来源: https://blog.csdn.net/qq_42856647/article/details/110088213