从Java并发迁移到Scala并发

oxb*_*kes 6 java concurrency scala actor

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

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

我使用的解决方案如下:

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

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

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

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

Apo*_*isp 5

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

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

如果工作项是发送给actor的事件,我如何确保支持线程池大于可以同时阻塞的项的数量

这让我觉得这是一种破坏并行化努力的设计.尽量减少或消除阻塞和全局状态.这些是可组合性和可伸缩性的障碍.例如,考虑使用一个等待文件到达的专用线程,然后将事件发送给actor.或者查看java.nio以获取异步非阻塞I/O.

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

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

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