我在 Java 中有一个相当标准的机制来解决这个问题:
- 必须安排工作项在特定时间执行
- 然后每个工作项必须等待条件变为真
- 工作项应该是可取消的
我使用的解决方案如下:
- 有一个单线程调度程序来安排我的工作项目
- 有一个
ExecutorService
(可能是多线程的) - 每个计划的工作项然后将实际工作提交给
ExecutorService
。返回的Future
缓存在 map 中。完成服务用于在工作完成时从缓存中删除 future - 可以通过缓存的 future 取消项目
当然,我的执行器需要至少与我期望的阻塞工作项的数量一样大,但这在实践中不是问题。
所以现在我在 Scala 中编码并使用 actor 框架。假设我的工作项可以封装在发送给参与者的事件中:
- 我会使用什么机制来安排特定时间的工作项目?
- 如果工作项是发送给参与者的事件,我如何确保后台线程池大于可同时阻塞的项目数
- 如何取消之前安排的工作项目?
最佳答案
What mechanism would I use to schedule a work item for a specific time?
我会使用 java.util.concurrent.ScheduledExecutorService。
If a work item is an event sent to an actor, how can I ensure that the backing thread pool is bigger than the number of items that can be blocking at the same time
我认为这是一种破坏并行化努力的设计。尽量减少或消除阻塞和全局状态。这些是可组合性和可扩展性的障碍。例如,考虑有一个专用线程等待文件到达,然后将事件发送给参与者。或者查看 java.nio 的异步非阻塞 I/O。
我不完全理解您在这里的要求,但看起来您可以让一个线程/参与者寻找 I/O 事件。然后作为您安排的“工作项目”,安排创建非阻塞 Actor 的效果。让这些参与者向 I/O 线程/参与者注册,以接收有关他们关心的 I/O 事件的消息。
How can I cause a previously scheduled work item to be cancelled?
ScheduledExecutorService
返回 Futures。在这方面,你所拥有的并不是一个糟糕的设计。将它们收集在 map 中并调用 future.cancel()。
关于java - 从 Java 并发迁移到 Scala 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/954882/