2011-09-11 95 views
1

我寫了一個程序來理解wait()和notify()方法。但是當我運行該程序時,它會掛起而沒有任何反應。基本上我希望一個線程(ThreadDemo)完成其執行(顯示其輸出),此後其他線程應該顯示其輸出(ThreadDemo2)。正確使用wait和notify

由於wait和notify需要使用相同的對象,所以我創建了通用類LogicClass。

你能指出我的代碼中有什麼問題嗎?我必須在我的項目中使用這些概念。

Program Link

+0

@all我已經找到了解決辦法。我在呼喚着兩個線程運行method.so刪除這個問題display()方法。 – Algorithmist

+1

這是使用調試器時的一個很好的例子。同樣值得嘗試的是,儘可能簡單地使示例如此簡單a)您更可能理解它,b)有人可能會閱讀它。 –

+0

@peter我肯定會按照你的建議。我試圖調試代碼。 – Algorithmist

回答

2

在代碼中,我注意到至少有兩個問題:

  • 你的主要功能不等待子線程加入,並因此將退出。使用Thread :: join。
  • 你永遠不會打電話show()函數,其中包括notifyAll
+0

謝謝。你指出了正確的問題。 – Algorithmist

1

很確定當主線程退出時,非守護線程不會退出。

如果可能的話,我建議使用java.util.concurrent包。它使得多線程不易出錯。例如,你錯過了一個可能導致永久等待的漏掉的通知警衛。如果你要使用閂鎖,它會解決這個問題。

**編輯

對不起,我應該說現有錯過通知衛兵(LogicClass值)可以有情況下,它不能正常工作 - 在同時等待前環或通知不足以保證哪個線程「贏得比賽」給顯示器。

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"); 
    } 
} 
相關問題