假设我有一个由Runnable
执行的ExecutorService
个对象的有序列表。我的Runnable
个对象提交了userID
- 假设我有 20 不同userId
- s而 10 是池中的线程(ExecutorService
对象)。
什么是一般设计模式,以确保一次在一个线程中执行特定组的最多1 Runnable
个对象? (目标是来自一个id组的所有Runnable
应该按时间顺序和同步执行。
答案 0 :(得分:1)
您可以为每个组创建队列,当任务终止时,您可以阅读相应的队列并在需要时提交下一个任务。
为此,您需要确定Runnable何时终止。使用标准的JDK类,您无法以一种简单的方式实现这一点,但使用Guava库可以将ExecutorService包装到ListeningExecutorService中。如果您通过此包装器提交任务,它将返回ListenableFuture而不是普通的Java Future。 ListenableFuture将允许您注册将在任务终止时执行的回调。在这些回调中,您可以检查队列并在同一组中提交下一个任务。
答案 1 :(得分:0)
对于每个Id,您需要一个像JavaDocs of Executor中描述的轻量级SerialExecutor。该实现不是最佳的 - 对于每个输入任务,它创建额外的服务Runnable。 Opimized版本可以在https://github.com/rfqu/CodeSamples/blob/master/src/simpleactor/SerialExecutor.java找到,其中SerialExecutor充当中间Runnable并在空闲时重新提交并且出现新任务。