线程礼让
- 礼让线程,让当前正在执行的线程暂停,但不阻塞
- 将线程从运行状态转为就绪状态
- 让cpu重新调度,礼让不一定成功!看cpu心情
语句格式
Thread.yield();//礼让
代码样式
package state;
//测试礼让线程
//礼让不一定成功,看cpu
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"B").start();
new Thread(myYield,"A").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始执行");
Thread.yield();//礼让
System.out.println(Thread.currentThread().getName()+"线程停止执行");
}
}
运行结果
A线程开始执行
B线程开始执行
A线程停止执行
B线程停止执行
未礼让结果
A线程开始执行
A线程停止执行
B线程开始执行
B线程停止执行
Join
Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
可以想象成插队
语句
thread.join();
join是Thread类的一个方法,启动线程后直接调用
为什么要使用join方法
在很多情况下,主线程生成并启动子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后在结束,这个时候就要用到join()方法
代码样式
package state;
public class TestJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("线程vip驾到,统统闪开"+i);
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
// 主线程
for (int i = 0; i < 10; i++) {
if (i==5){
thread.start();
try {
thread.join();//插队
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main"+i);
}
}
}
运行结果:
main0
main1
main2
main3
main4
线程vip驾到,统统闪开0
线程vip驾到,统统闪开1
线程vip驾到,统统闪开2
线程vip驾到,统统闪开3
线程vip驾到,统统闪开4
main5
main6
main7
main8
main9