这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码;
比如有三个人小红、小李、小王, 三个人相约一起去酒店吃饭,菜已经点好了, 三个人从不同的地方出发,只有三个人都到了酒店之后才会开始上菜;那么这三个人就分别代表三个线程,这三个线程执行完之后才会执行 “上菜” 的代码逻辑,
代码示例
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("人齐了,酒店服务员开始上菜"); }
运行后结果如下
所以这个方法一定不要使用;