gpt4 book ai didi

java - 我应该使用什么同步原语来实现 Java 中的事件驱动程序框架?

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:34 24 4
gpt4 key购买 nike

我有一个循环线程来执行任务。其他线程可以向此循环线程提交任务。有些任务是立即任务,有些是 future 任务,在提交后 T 秒后执行。我用PriorityBlockingQueue存储任务,以时间为优先级,使得队列中的第一个任务是最紧迫要执行的任务。

looper 的主循环是作为 Fellows:

PriorityBlockingQueue<Event> taskQueue = ...
while (true) {
if (taskQueue.isEmpty())
<something>.wait(); // wait indefinitely
else
<something>.wait(taskQueue.peek().time - NOW()); // wait for the first task
Task task = taskQueue.poll(0); // take the first task without waiting
if (task != null && task.time <= NOW())
task.execute();
else if (task != null)
taskQueue.offer(task); // not yet runnable, put it back
}

looper提供允许其他线程(或本身)提交任务:

public void submitTask (Task task) { // time information is contained in the task.
taskQueue.offer(task);
<something>.signal(); // informs the loop thread that new task is avaliable.
}

在这里,我只有一个线程调用 wait()和多个线程调用 signal() 。我的问题是我应该使用什么同步原语来代替 <something>java.util.concurrent中有如此多的原语和java.util.concurrent.lock包裹。还有synchronized关键字和Object.wait()/notify() 。哪一个最适合这里?

最佳答案

您不需要执行任何操作。

BlockingQueue 的重点在于它已经为您管理线程同步。您无需通知其他线程现在有新内容可用。

直接使用

 taskQueue.take(); // blocks until something is there

 taskQueue.poll(1, SECONDS); // wait for a while then give up

对于不应该立即处理的“ future 任务”,我根本不会将它们添加到此队列中。您可以使用 ScheduledExecutorService一旦时间到了,将它们添加到任务队列(实际上是第二个队列)。

想一想,您可以完全取消 BlockingQueue,而只使用 ScheduledExecutorService(由单个线程,您的“循环器”支持)来完成所有任务。

关于java - 我应该使用什么同步原语来实现 Java 中的事件驱动程序框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28145541/

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