我想一个接一个地运行两个线程,而不使用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) {
}
}
}
}
}
答案 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
。但我不确定它是否会让当前的线程重新开始。