java - 从 Java 并发迁移到 Scala 并发

标签 java scala concurrency actor

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

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

我使用的解决方案如下:

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

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

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

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

最佳答案

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/

相关文章:

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

JavaFX - ScrollPane 和设置大小

Java NIO。模拟基本下载应用程序是否有效的解决方案?

java - 如何在Spring Boot中从旧 token 生成新的JWT token ?

Scala:覆盖通用 Java 方法 II

Go - goroutine 之间的高性能通信?

java - Jersey Rest Web 服务重定向到同一页面

html - HTML 模板中的 playframework JsValue

scala - Apache Zeppelin 无法反序列化数据集 : "NoSuchMethodError"

java - Java中不同程序的并发读写