我正在尝试创建一个通用的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(); }。也许这与我如何使用同步块有关,但是我在Java中看到了关于生产者-消费者的问题,这看起来确实应该按照答案来实现,但这并没有解决挂起的功能问题。任何帮助将不胜感激。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 每个MessagePrinter实例将拥有其自己的mc字段副本,因此每个线程都将输入不同的Monitors Wait方法。调用notifyAll()不会执行任何操作,因为没有人会在管理器mc监视器上等待。使mc静态。编辑-尽管您已经接受了答案,但我想我会把它放在那里,因为您会遇到它。当您在管理器线程中调用.notifyAll()时,它将通知在该对象监视器上等待的所有线程,但是在任何给定时间只有一个线程能够要求锁定。无法保证将获得该锁,只有在任何给定时间都能获得该锁。该线程将释放锁定,然后如果条件为真,它将被重置为false。同时,其他线程之一将被唤醒,并可能在信号标志重置为false之后不久评估您的while条件,这意味着您的一个或多个客户端可能无法打印其消息。这是运行一段时间后如何在应用程序输出中显示的示例:7 second message!5615625635645655 second message!5665675685695705715725735747 second message!5755 second message! (adsbygoogle = window.adsbygoogle || []).push({});
09-13 10:24