鉴于以下关于死锁的代码...为什么死锁不会在这里发生,我应该做些什么来发生死锁

时间:2018-01-18 17:42:33

标签: java output deadlock

public class Test15_DeadLockUsingJoinMethod {
    public static void main(String[] args) throws InterruptedException {

        JoinThread1 jt1=new JoinThread1(jt2); 
        JoinThread2 jt2=new JoinThread2(jt1);
        jt1.start();
        jt2.start();
    }

}

class JoinThread1 extends Thread {

    JoinThread2 jt2;
    public JoinThread1(JoinThread2 jt2) {
        this.jt2=jt2;
    }
    public void run() {
        System.out.println("1st thread execution start");
        try {
            jt2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1st thread execution stopped"); 
    }
}

class JoinThread2 extends Thread {

    JoinThread1 jt1;
    public JoinThread2(JoinThread1 jt1) {
        this.jt1=jt1;

    }
    public void run() {
        System.out.println("2nd thread execution start");
        try {
            jt1.join();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
            System.out.println("2nd thread execution stopped"); 
    }
}

这里我想仅使用join()方法查看死锁情况。我知道使用synchronized关键字的死锁代码。但是如何使用join方法执行死锁条件?

1 个答案:

答案 0 :(得分:0)

您的代码无法编译,您在jt2的构造函数中使用jt1,然后才定义它。

为了获得死锁,您应该为JoinThread1定义一个没有任何参数的新构造函数。所以,首先使用新的构造函数定义jt1。然后定义jt2通过参数jt1(就像你现在一样)。然后,您应该为JoinThread1中的另一个线程定义setter

<强> 实施例

新构造函数

public JoinThread1() {
}

Setter方法

public void setThread(JoinThread2 jt2){
    this.jt2 = jt2;
}

主要

public static void main(String [] args)抛出InterruptedException {

    JoinThread1 jt1=new JoinThread1(); 
    JoinThread2 jt2=new JoinThread2(jt1);
    jt1.setThread(jt2);

    jt1.start();
    jt2.start();
}

在更改之后,您将陷入僵局。