gpt4 book ai didi

java - 线程没有通过通知唤醒

转载 作者:行者123 更新时间:2023-12-01 17:22:53 25 4
gpt4 key购买 nike

我有以下场景:多个事件来自同一个源,每个事件具有不同的类型。我需要按顺序对相同类型的每个事件执行某些操作,如果是其他类型则并行执行。含义:

事件来源:A1、A2、B1、A3、B2、C1

  • 监听器 A 必须对 A1、A2 和 A3 进行排队,并在其中与它们一起工作顺序,在单个线程中
  • 监听器 B 与 A 相同,并行,在不同的线程中
  • 监听器 C 与 B 相同,并行,在不同的线程中

我正在做什么来实现这个目标?一般来说,我对每种类型的事件都有一个监视器,我用新线程初始化它,然后调用 wait()。每个监视器都有一个队列。

Monitor.java(实现可运行)

public void run(){
while(!killed){
synchronize(this){
while(this.stopped){
wait(); //it waits here when initialized, waiting for the first event
}

while(eventQueue.size() > 0){
//do something with the event
}

//i set the flag stopped = true again to wait for the next event
this.stopped = true;
}
}
}

当事件到达时,我将其添加到队列中,然后通知()监视器,以便它中断 while

public void awake(Event event){
synchronize(this){
eventQueue.add(event);
this.stopped = false;
notify();
}
}

“killed”标志用于保持线程处于 Activity 状态,直到满足某些条件。然后,我将killed标志设置为true并通知监视器结束线程。

我的问题是当我运行一组事件时,有时线程不会通过notify() 唤醒。有时处理 10 个事件中的 10 个,有时处理 10 个事件中的 8 个,依此类推。

我一直在寻找并发API来寻找解决我的问题的替代方案,但我找不到任何好的东西。你们能给我一些关于如何应对这个问题的建议吗?

我希望我能以一种好的方式解释我的问题。如果没有,请询​​问。

提前致谢。

最佳答案

The "killed" flag is used to maintain the thread alive until certain criteria is met. Then, i set the killed flag on true and notify the monitor to end the thread.

首先,我会认真考虑将您的代码切换为使用 BlockingQueue,例如 LinkedBlockingQueue。您仍然可以使用 killed 标志(顺便说一句,它必须是 voltile),但通过使用 BlockingQueue ,所有信号都会为您处理。您要做的就是调用 put() 将内容添加到队列中,并调用 take() 从中读取内容。然后,您不需要使用 synchronizedwaitnotify。您根本不需要 stopped 标志。见下文。

while (!killed) {
Event event = eventQueue.take();
...

My problem is when i run a set of events, sometimes the thread does not awake with the notify(). Sometimes 10 out of 10 events are processed, sometimes, it's 8 of 10 and so on.

就您当前代码的问题而言,我没有发现任何问题,但问题在于细节。要记住的一件事是,如果线程 A 调用 notify() 并且然后线程 B 调用 wait(),则通知已丢失。我认为您想做类似以下的事情:

while(!killed){
Event event;
synchronized (this) {
// wait until where is something in the queue
while(eventQueue.isEmpty()){
this.wait();
}
event = eventQueue.get();
}
// work with event
...

只有当队列为空并且不需要stopped boolean 值时,这才会起作用。

关于java - 线程没有通过通知唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17298790/

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