我编写了一个程序来理解wait()和notify()方法。但是当我运行该程序时,它会挂起并且没有任何反应。基本上我想要一个线程(ThreadDemo)来完成它的执行(显示它的输出),然后其他线程应该显示它的输出(ThreadDemo2)。
由于wait和notify要求使用相同的对象,我创建了公共类LogicClass。
请指出我的代码中有什么问题?我必须在我的项目中使用这些概念。
答案 0 :(得分:2)
在代码中,我至少注意到两个问题:
show()
的{{1}}函数。 答案 1 :(得分:1)
非常确定当主线程退出时,非守护程序线程不会退出。
我建议尽可能使用java.util.concurrent包。它使多线程不易出错。您缺少例如错过的通知警卫,可能导致永久等待。如果您使用闩锁,它将解决该问题。
**编辑
对不起我应该说你现有的错过通知保护(LogicClass中的值)可能会出现无法正常运行的情况 - 等待或通知之前的while循环不足以保证哪个线程“赢得比赛”监视器。
答案 2 :(得分:0)
我之前发表了一篇评论,说明如何缩短代码,同时仍然展示相同的行为。您可以看到一个线程正在运行show
,另一个正在运行display
class ThreadMain {
public static void main(String[] args) {
final LogicClass lg = new LogicClass(true);
new Thread(new Runnable() {
public void run() {
System.out.println("In threadDemo run method");
lg.show(10);
}
}).start();
new Thread(new Runnable() {
public void run() {
System.out.println("In thread2 run method");
lg.display(5);
}
}).start();
System.out.println("Hi, in main");
}
}
class LogicClass {
boolean value;
public LogicClass(boolean value) {
this.value = value;
}
synchronized void show(int a) {
if (value) {
for (; a != 0; a--)
System.out.println("This Output should come first");
value = false;
notifyAll();
}
}
synchronized void display(int a) {
while (value) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (; a != 0; a--)
System.out.println("This should come later");
}
}