假设我有一个队列,里面装满了我需要提交给执行程序服务的任务。我希望他们一次处理一个。我能想到的最简单的方法是:
- 从队列中取出一个任务
- 提交给执行人
- 在返回的 Future 上调用 .get 并阻塞直到结果可用
- 从队列中取出另一个任务…
但是,我试图避免完全阻塞。如果我有 10,000 个这样的队列,它们需要一次处理一个任务,我就会用完堆栈空间,因为它们中的大多数都将占用阻塞的线程。
我想要的是提交任务并提供任务完成时调用的回调。我将使用该回调通知作为发送下一个任务的标志。 (functionaljava和jetlang显然使用了这样的非阻塞算法,但我看不懂他们的代码)
我如何使用 JDK 的 java.util.concurrent 来做到这一点,而不是编写我自己的执行程序服务?
(为我提供这些任务的队列本身可能会阻塞,但这是一个稍后要解决的问题)
原文由 Shahbaz 发布,翻译遵循 CC BY-SA 4.0 许可协议
定义一个回调接口来接收您想要在完成通知中传递的任何参数。然后在任务结束时调用它。
您甚至可以为 Runnable 任务编写通用包装器,并将它们提交给
ExecutorService
。或者,请参阅下面的 Java 8 内置机制。借助
CompletableFuture
,Java 8 包含了一种更精细的方法来组合可以异步和有条件地完成进程的管道。这是一个人为但完整的通知示例。