- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是来自线程的代码块:
synchronized(lock)
{
lock.notifyAll();
System.out.println("waking other threads up with lock:"+lock.hashCode());
}
调用了四次,仍然无法唤醒其他线程。
具有此部分的其他线程:
synchronized(lock)
{
while(continuing)
{
System.out.println("will wait on: "+lock.hashCode());
try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}
System.out.println("awaken on: "+lock.hashCode());
}
}
输出:
waking other threads up with lock: 68393799
waking other threads up with lock: 68393799
waking other threads up with lock: 68393799
waking other threads up with lock: 68393799
-- producer thread has finished so cannot revive consumers
will wait on: 68393799
-- stuck waiting forever itself, nothing to wake it up
所以等待线程无法被唤醒。
这是否意味着notifyAll()无法处理 future 的等待,而仅适用于“现在”等待的线程(这意味着在同一CPU周期或接近几个周期?)?如果是,如果我需要完全相同数量的等待唤醒次数,是否需要添加一个变量来保存“通知”操作的数量?
我需要这种输出:
wake up
wake up
wake up
wake up
---- producer thread finished its job here
---- consumer threads just began working from here
waiting thr0
awaken thr0
waiting thr1
waiting thr2
awaken thr2
awaken thr1
waiting thr3
awaken thr
将会有许多消费者和生产者同时启动,因此为了简单起见,我选择输出为串行。
最佳答案
Does this mean notifyAll() cannot work on future waits and works only for threads waiting "now"
是的。 notifyAll() 通知所有等待线程。不是将来会等待锁的线程。
线程等待锁,因为在验证某些条件之前它无法继续操作。例如,消息发送线程只有在有消息可以继续时才能继续。线程退出等待状态时应该做的第一件事是再次检查条件。如果条件得到验证,则应继续进行。否则,应该再次等待。
目前尚不清楚您的意图是什么。如果您正在设计生产者/消费者系统,则应该在线程之间共享数据结构(生成的、必须消耗的“事物”列表)。消费者应该等到生产者将某些内容放入列表中。
这正是 BlockingQueue 为您所做的事情,而不会强制您搞乱 wait() 和 notificationAll()。您应该使用 BlockingQueue,它提供了更易于使用、更高级别的抽象。
关于Java notifyAll() 本身没有队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010016/
我的程序应该使用线程(为了学习线程)按顺序打印出从 1 到 10 的数字。问题是程序陷入僵局。这是为什么? 我像这样创建 10 个线程: for (int i = 0; i < 10; i++) {
这是我的代码,每次运行代码时输出都会有所不同。有时,所有三个读者都会收到通知,输出为: 等待计算... 等待计算... 等待计算... 完成 总计:4950Thread-1 总计:4950Thread
我正在编写一个小Java程序,我需要在其中创建线程(代码中的哲学家),而这些哲学家需要在思考、饥饿和进食之间改变状态。我对这个项目还没有那么深入,我有下一个问题: public class NewMa
这是来自线程的代码块: synchronized(lock) { lock.notifyAll(); System.out.println("waking other threads
假设我有一个用 Java 实现的读/写监视器。 多个读取器或一个写入器可以同时访问数据库(不能同时访问) class RWmonitor{ private int readers = 0;
我正在尝试使用线程在 Java 中实现 Bully 算法。 这是我写的代码。 package newbully; public class NewBully { public static v
我想我应该说的第一件事是我不是在寻找解决方案,这是 hwk,但它运行正确,对我有很大帮助的是澄清.. 我们刚刚在我的面向对象编程类(class)中介绍了线程,并收到了我完成的作业。在我的代码中,我从不
在下面的代码中调用了 notifyAll() 但没有重新激活其他线程。我得到的输出是 beta 等待通知时间:1441870698303,activeWriters:1 alpha 等待通知时间:14
此代码从两个不同的线程打印偶数/奇数。在这里,我的程序卡在 wait() 中,无法使用 notifyAll() 唤醒 sleep 线程。 想知道为什么notifyAll无法唤醒所有 hibernate
所以,我有以下对象(为示例而简化): public class SomeListener implements EventListener{ public final Object lock
我正在做一个练习,模拟商店中具有多个线程的等待队列。 我有一个等候名单和 2 个柜台当某个客户端排在等待列表的第一位并且柜台有空闲时,该客户端进入柜台等待2秒,通知其他客户端然后离开。 我不明白为什么
我不理解 Java 并发实践书中的以下片段: 当只有一个线程可以取得进展时使用 notifyAll 是低效的 - 有时是一点点,有时是非常低效。如果有 10 个线程在一个条件队列上等待,调用 noti
public class ShareResource { private int n = 0; public synchronized void p() throws InterruptedExcep
import java.math.BigInteger; class Numbers { final static int NUMBER = 2; final static int P
我已经使用 JVMTI 实现了一个简单的分析器来显示对 wait() 和 notifyAll() 的调用。作为测试用例,我正在使用。 producer consumer example of Orac
我想知道在这种情况下会发生什么:我有 10 个线程在某些 lockObject 上等待(使用 wait)和 1 个线程(我们称之为 X 线程)试图进入由 lockObject 同步的 block 。那
我有一个有两种方法的类,一个发送消息,另一个确认消息已被接收/处理 public void send(OTAHotelAvailRS otaHotelAvailRS) throws Except
这是我编写的多线程队列的小片段, synchronized void add(int i) { if (count == size) { System.out.println(
所有线程都可以等待,但只能通知1个线程(最后一个线程)。如何notifyAll所有线程? public class Server { static Socket clientSocket; sta
我正在开发一个Java应用程序,当按下GUI中的按钮时,用户可以单击屏幕上的任意位置来记录他们单击的位置的x和y坐标。 这是通过以下方式完成的在整个屏幕上放置一个未修饰的、部分透明的 JFrame,用
我是一名优秀的程序员,十分优秀!