我寫了一個程序來理解wait()和notify()方法。但是當我運行該程序時,它會掛起而沒有任何反應。基本上我希望一個線程(ThreadDemo)完成其執行(顯示其輸出),此後其他線程應該顯示其輸出(ThreadDemo2)。正確使用wait和notify
由於wait和notify需要使用相同的對象,所以我創建了通用類LogicClass。
你能指出我的代碼中有什麼問題嗎?我必須在我的項目中使用這些概念。
我寫了一個程序來理解wait()和notify()方法。但是當我運行該程序時,它會掛起而沒有任何反應。基本上我希望一個線程(ThreadDemo)完成其執行(顯示其輸出),此後其他線程應該顯示其輸出(ThreadDemo2)。正確使用wait和notify
由於wait和notify需要使用相同的對象,所以我創建了通用類LogicClass。
你能指出我的代碼中有什麼問題嗎?我必須在我的項目中使用這些概念。
在代碼中,我注意到至少有兩個問題:
show()
函數,其中包括notifyAll
。謝謝。你指出了正確的問題。 – Algorithmist
很確定當主線程退出時,非守護線程不會退出。
如果可能的話,我建議使用java.util.concurrent包。它使得多線程不易出錯。例如,你錯過了一個可能導致永久等待的漏掉的通知警衛。如果你要使用閂鎖,它會解決這個問題。
**編輯
對不起,我應該說現有錯過通知衛兵(LogicClass值)可以有情況下,它不能正常工作 - 在同時等待前環或通知不足以保證哪個線程「贏得比賽」給顯示器。
我早些時候發表了一個評論,關於如何縮短代碼,同時仍然展示相同的行爲。你可以看到一個線程在運行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");
}
}
@all我已經找到了解決辦法。我在呼喚着兩個線程運行method.so刪除這個問題display()方法。 – Algorithmist
這是使用調試器時的一個很好的例子。同樣值得嘗試的是,儘可能簡單地使示例如此簡單a)您更可能理解它,b)有人可能會閱讀它。 –
@peter我肯定會按照你的建議。我試圖調試代碼。 – Algorithmist