簡體   English   中英

Java —等待方法未退出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM