设计模式,以保证池中只执行一个特定id值的Runnable对象

时间:2014-02-19 17:43:05

标签: java multithreading threadpool grouping

假设我有一个由Runnable执行的ExecutorService个对象的有序列表。我的Runnable个对象提交了userID - 假设我有 20 不同userId - s而 10 是池中的线程(ExecutorService对象)。

什么是一般设计模式,以确保一次在一个线程中执行特定组的最多1 Runnable个对象? (目标是来自一个id组的所有Runnable应该按时间顺序和同步执行。

2 个答案:

答案 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并在空闲时重新提交并且出现新任务。