我应该使用什么同步原语来实现 Java 中的事件驱动程序框架?
What synchronization primitive should I use to implement a event driver framework in Java?
我有一个循环线程来执行任务。其他线程可以向这个循环线程提交任务。有些任务是即时任务,有些是未来任务,在提交后T秒后执行。我使用PriorityBlockingQueue
来存储任务,这里以时间为优先级,这样队列的第一个任务就是最迫在眉睫的任务。
looper的主循环如下:
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 tasks"不应该立即处理的,我根本不会将它们添加到此队列中。您可以使用 ScheduledExecutorService 将它们添加到任务队列中(实际上是第二个队列)。
想想看,您可以完全取消 BlockingQueue,只使用 ScheduledExecutorService(由单个线程支持,您的 "looper")完成所有任务。
j.u.c。包中包含可以满足您问题的 DelayedQueue。
每个排队的对象都应该使用 getDelay(..) 方法实现延迟接口。
我有一个循环线程来执行任务。其他线程可以向这个循环线程提交任务。有些任务是即时任务,有些是未来任务,在提交后T秒后执行。我使用PriorityBlockingQueue
来存储任务,这里以时间为优先级,这样队列的第一个任务就是最迫在眉睫的任务。
looper的主循环如下:
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 tasks"不应该立即处理的,我根本不会将它们添加到此队列中。您可以使用 ScheduledExecutorService 将它们添加到任务队列中(实际上是第二个队列)。
想想看,您可以完全取消 BlockingQueue,只使用 ScheduledExecutorService(由单个线程支持,您的 "looper")完成所有任务。
j.u.c。包中包含可以满足您问题的 DelayedQueue。 每个排队的对象都应该使用 getDelay(..) 方法实现延迟接口。