java join()方法的作用以及造成死锁的原因
2021/7/4 20:25:14
本文主要是介绍java join()方法的作用以及造成死锁的原因,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
join() 方法的作用
这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码;
应用场景
比如有三个人小红、小李、小王, 三个人相约一起去酒店吃饭,菜已经点好了, 三个人从不同的地方出发,只有三个人都到了酒店之后才会开始上菜;那么这三个人就分别代表三个线程,这三个线程执行完之后才会执行 “上菜” 的代码逻辑,
代码示例
package com.Lock; public class ConutDownLatchDemo_1 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "开始出发了"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "到酒店了"); } } // 运行main方法 class Main2 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new ConutDownLatchDemo_1(), "小红"); t1.start(); Thread t2 = new Thread(new ConutDownLatchDemo_1(), "小王"); t2.start(); Thread t3 = new Thread(new ConutDownLatchDemo_1(), "小李"); t3.start(); System.out.println("酒店正在等待大家的到来....."); // 等待其他线程完成后在执行,当执行到join方法时,主线程会挂起,等待其他线程执行完后在执行join下面的代码 t3.join(); System.out.println("人齐了,酒店服务员开始上菜"); } }
打印结果
坑点
java的join方法中,这里有一个坑,就是下面这个方法
Thread.currentThread().join();
我们都知道 ,join方法的作用是阻塞,即等待线程结束,才继续执行。如果调用了Thread.currentThread().join(); 这个方法,那么线程一直在阻塞,无法终止。因为它自己在等待自己结束;这无疑会造成死锁;
接下来我们来测试一把,代码和上面的一样,只需要改一行代码即可,在上面的代码的main方法中,将 t3.join(); 改为 Thread.currentThread().join(); 即可;
public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new ConutDownLatchDemo_1(), "小红"); t1.start(); Thread t2 = new Thread(new ConutDownLatchDemo_1(), "小王"); t2.start(); Thread t3 = new Thread(new ConutDownLatchDemo_1(), "小李"); t3.start(); System.out.println("酒店正在等待大家的到来....."); // 等待其他线程完成后在执行,当执行到join方法时,主线程会挂起,等待其他线程执行完后在执行join下面的代码 // 将 t3.join(); 改为 Thread.currentThread().join(); Thread.currentThread().join(); // 因为自己在等自己完成,所以会一直阻塞在这,下面的代码永远也不会执行 System.out.println("人齐了,酒店服务员开始上菜"); }
运行后结果如下
所以这个方法一定不要使用;
这篇关于java join()方法的作用以及造成死锁的原因的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)