【发布时间】:2010-12-03 21:29:32
【问题描述】:
假设我有一个任务是从 java.util.concurrent.BlockingQueue 中提取元素并处理它们。
public void scheduleTask(int delay, TimeUnit timeUnit)
{
scheduledExecutorService.scheduleWithFixedDelay(new Task(queue), 0, delay, timeUnit);
}
如果可以动态更改频率,我如何安排/重新安排任务?
- 我们的想法是获取数据更新流并将它们批量传播到 GUI
- 用户应该能够改变更新频率
【问题讨论】:
-
我不清楚您为什么要使用阻塞队列。如果你的队列是空的。我假设您的计划任务将被阻止。这是你的意图吗?这可能会混淆任务调度程序的计时。
-
我选择了 ArrayBlockingQueue 实现,因为它必须是线程安全的、尊重 FIFO 排序和有界的。就算任务阻塞了,也不应该混淆任务调度吧?
-
您使用 BlockingQueue 实现是正确的(实际上 ScheduledThreadPoolExecutor 在内部使用了一个)。但是,您为什么要使用计时器将更新传播到 GUI?为什么不实时进行呢?更新太多了吗?您是否担心 Swing 线程旋转?
-
我想批量更新。所以在内部,事件可能每毫秒到达一次,但 gui 会每 100 毫秒刷新一次。我认为这在视觉上会更具吸引力,并且 CPU 开销也会更少。我使用的是 Eclipse RCP 而不是 Swing。
标签: java concurrency executorservice blockingqueue