java join()方法的作用以及造成死锁的原因

join() 方法的作用

    这个方法的作用是先将当前线程挂起,待其他线程结束后在执行当前线程的代码;java join()方法的作用以及造成死锁的原因

应用场景

比如有三个人小红、小李、小王, 三个人相约一起去酒店吃饭,菜已经点好了, 三个人从不同的地方出发,只有三个人都到了酒店之后才会开始上菜;那么这三个人就分别代表三个线程,这三个线程执行完之后才会执行 “上菜” 的代码逻辑,

java 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()方法的作用以及造成死锁的原因

坑点

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()方法的作用以及造成死锁的原因

所以这个方法一定不要使用;

上一篇:Exchanger


下一篇:NSThread和fork