2009-06-05 14 views
6

我在Java中的相当标准的机制来解决这个问题:从Java并发迁移到Scala的并发

  • 工作项目必须安排在特定的时间
  • 执行,然后每个工作项目必须等待成为真正的
  • 工作项目的条件应当是撤销

我使用的解决方案如下:

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

当然被取消,我的遗嘱执行人必须至少一样大的数量阻碍我期望有的工作项目,但这在实践中并不是问题。

所以现在我在Scala中编码并使用actor框架。假设我的工作项目可以封装在发送给演员的事件中:

  1. 我将使用什么机制来安排工作项目在特定时间?
  2. 如果工作项目是发送给演员的事件,我如何确保后备线程池的数量大于可同时阻止的项目数
  3. 如何导致以前计划的工作项目被取消?
+0

您能否详细说明“成为真的条件”是什么意思?这是全球性的国家吗?它是I/O吗? – Apocalisp 2009-06-05 16:14:21

+0

我只是意味着,作为工作的一部分,这个过程可能不得不阻止发生的事情(如文件到达) – 2009-06-05 17:19:00

回答

5

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

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

如果一个工作项目是发送到一个演员的情况下,我怎么能保证后盾线程池比可以在同一时间被封锁

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

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

如何使先前计划的工作项目被取消?

ScheduledExecutorService退货期货。你在这方面的设计不错。将它们收集到一个Map中并调用future.cancel()。

1

你可能有一个调度actor有一个调度actor的列表,并且使用Actor.receiveWithin()每秒醒来并发送消息给准备好执行的actor。调度演员也可以处理取消。另一种选择是让每个角色直接使用receiveWithin()处理自己的调度,而不是集中调度。

在博客文章Simple cron like scheduler in Scala中对此问题进行了一些讨论。