6

我在 Java 中有一个相当标准的机制来解决这个问题:

  • 必须安排工作项在特定时间执行
  • 然后每个工作项必须等待条件变为真
  • 工作项目应该是可取消的

我使用的解决方案如下:

  1. 有一个单线程调度程序来安排我的工作项目
  2. 有一个ExecutorService(可能是多线程的)
  3. 然后每个计划的工作项将实际工作提交给ExecutorService. 返回Future的缓存在地图中。完成服务用于在工作完成时从缓存中删除未来
  4. 可以通过缓存的期货取消项目

当然,我的 executor 至少需要与我期望的阻塞工作项的数量一样大,但这在实践中不是问题。

所以现在我正在使用 Scala 进行编码并使用 actor 框架。假设我的工作项可以封装在发送给参与者的事件中:

  1. 我将使用什么机制来安排特定时间的工作项?
  2. 如果工作项是发送给参与者的事件,我如何确保后备线程池大于可以同时阻塞的项目数
  3. 如何取消之前安排的工作项目?
4

2 回答 2

5

我将使用什么机制来安排特定时间的工作项?

我会使用 java.util.concurrent.ScheduledExecutorService。

如果工作项是发送给参与者的事件,我如何确保后备线程池大于可以同时阻塞的项目数

这让我觉得这是一种挫败并行化努力的设计。尽量减少或消除阻塞和全局状态。这些是可组合性和可扩展性的障碍。例如,考虑有一个专用线程等待文件到达,然后向参与者触发事件。或者查看 java.nio 以了解异步非阻塞 I/O。

我在这里不完全理解您的要求,但似乎您可以有一个线程/actor 来查找 I/O 事件。然后作为您计划的“工作项”,计划创建非阻塞演员的效果。让这些参与者向 I/O 线程/参与者注册自己,以接收有关他们关心的 I/O 事件的消息。

如何取消之前安排的工作项目?

ScheduledExecutorService返回期货。在这方面,你所拥有的并不是一个糟糕的设计。在地图中收集它们并调用future.cancel()。

于 2009-06-06T03:54:40.903 回答
1

你可以有一个调度actor,它有一个调度actor列表,并使用Actor.receiveWithin()每隔一秒左右唤醒一次,并向准备执行的actor发送消息。调度参与者也可以处理取消。另一种选择是让每个参与者直接使用 receiveWithin() 处理自己的调度,而不是集中调度。

在博文Simple cron like scheduler in Scala中有一些关于这个问题的讨论。

于 2009-06-07T07:13:39.597 回答