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("人齐了,酒店服务员开始上菜");
}
运行后结果如下
所以这个方法一定不要使用;