gpt4 book ai didi

Java notifyAll() 本身没有队列

转载 作者:行者123 更新时间:2023-12-01 12:00:30 29 4
gpt4 key购买 nike

这是来自线程的代码块:

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com