[英]Java — wait method not exiting
我正在嘗試創建一個通用的MessagePrinter
類,該類處理多個線程,每個線程每秒鍾都會打印出一條消息。 另外,還有一個管理器線程,它跟蹤時間並每秒喚醒每個線程,並且在喚醒每個線程之后,每個線程都需要檢查是否是打印消息的時間。
但是,有一個主要錯誤-當我等待被喚醒時調用wait()
函數時, wait()
函數並沒有退出。 我在Google上進行了搜索,但無濟於事。 下面是代碼。
import java.util.*;
class MonitorCondition {}
public class MessagePrinter implements Runnable {
private static int time = 0;
private MonitorCondition mc = new MonitorCondition();
private int elapse;
private String title;
private boolean signaled;
public MessagePrinter(int elapse, String title) {
this.elapse = elapse;
this.title = title;
new Thread(this, title).start();
this.signaled = false;
}
// http://tutorials.jenkov.com/java-concurrency/thread-signaling.html
public void run() {
if(!title.equals("manager")) {
while(true) {
synchronized(mc) {
while(!signaled) {
try { mc.wait(); }
// Now check whether we can print.
catch(InterruptedException e) {;}
}
if(time % elapse == 0)
System.out.println(elapse + " second message!");
signaled = false;
}
}
} else {
while(true) {
try { Thread.sleep(1000); } // REGARDLESS of what elapse is set to
catch(InterruptedException e) {;}
synchronized(mc) {
System.out.println(++time);
signaled = true;
mc.notifyAll();
}
}
}
}
public static void main(String[] args) {
MessagePrinter m1 = new MessagePrinter(1, "manager");
MessagePrinter m2 = new MessagePrinter(7, "client1");
MessagePrinter m3 = new MessagePrinter(5, "client2");
}
}
代碼掛在這行上: try { mc.wait(); }
try { mc.wait(); }
。 也許這是我如何使用同步塊的問題,但是我已經看到了Java中關於生產者-消費者的問題,這看起來確實應該按照答案來實現,但是這並沒有解決掛起的wait()
函數問題。 任何幫助將不勝感激。
每個MessagePrinter實例將擁有其自己的mc字段副本,因此每個線程都將輸入不同的Monitors Wait方法。 調用notifyAll()不會執行任何操作,因為沒有人會在管理器mc監視器上等待。 使mc靜態。
編輯-盡管您已經接受了答案,但我想我會把它放在那里,因為您會遇到它。 當您在管理器線程中調用.notifyAll()時,它將通知在該對象監視器上等待的所有線程,但是在任何給定時間只有一個線程能夠要求鎖定。 無法保證將獲得該鎖,只有在任何給定時間都能獲得該鎖。 該線程將釋放鎖定,然后如果條件為真,它將被重置為false。 同時,其他線程之一將被喚醒,並可能在信號標志重置為false之后不久評估您的while條件,這意味着您的一個或多個客戶端可能無法打印其消息。
這是運行一段時間后如何在應用程序輸出中顯示的示例:
7 second message!
561
562
563
564
565
5 second message!
566
567
568
569
570
571
572
573
574
7 second message!
575
5 second message!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.