Java等待和通知使死锁

时间:2015-05-16 05:33:00

标签: java multithreading

我想一个接一个地运行两个线程,而不使用sleep()或Locks,但发生了死锁!我的代码出了什么问题?我使用了wait()和notifyAll()以及一个Object对象。

public class Test {

    public static void main(String[] args) throws InterruptedException {
        PrintChar a = new PrintChar('a');
        PrintChar b = new PrintChar('b');
        Thread ta = new Thread(a);
        Thread tb = new Thread(b);
        ta.start();
        tb.start();
    }
}

class PrintChar implements Runnable {
    final Object o = new Object();
    char ch;
    public PrintChar(char a) {
        ch = a;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (o) {
                System.out.print(ch);
                try {
                    o.wait();
                    o.notifyAll();
                } catch (InterruptedException ex) {
                }
            }
        }
    } 
}

2 个答案:

答案 0 :(得分:7)

运行你的代码并查看它,我发现你生成的每个线程都在生成并同步到它自己的对象,因此阻止它们相互通知。我还发现你在通知之前等待,所以你永远不会调用o.notifyAll(),因为o.wait()会先停止它。

final Object o = new Object()更改为static final Object o = new Object(),并切换o.wait()o.notifyAll()的位置

答案 1 :(得分:-1)

我认为synchronized阻止导致死锁。因为它不会让另一个线程开始直到当前线程结束。您正在使用wait()方法使当前线程等待。好的,它会等待,但由于它在synchronized块中,它将永远在当前线程中,因为synchronized而永远不会让任何其他线程存在。

使另一个线程工作的一件事是使用Thread.stop。尝试在当前主题的参考中调用stop method。但我不确定它是否会让当前的线程重新开始。