【发布时间】:2012-10-22 06:24:39
【问题描述】:
我有一个可以异步处理的无限作业队列。每个作业的处理可能会或可能不会触发为此队列创建新作业。
我想要一个由多个工作线程组成的池来从这个队列中获取项目并并行处理它们,直到队列都为空并且所有工作线程都处于空闲状态等待队列中的新作业(因为忙碌的工作人员最终可能会将新作业添加到队列中)。
是否有使用java.util.concurrent 实现的方法,我可以使用它来解决这个特殊问题,其中工人也是生产者?尚不清楚 API 是否以直接的方式支持这种情况。
特别是,我希望能够检测到终止条件,即当没有更多作业可用(空作业队列)并且不会再产生作业(所有空闲工作线程)时。
编辑
下面的 Nam San 的回答似乎是最优雅的方法,它基本上归结为跟踪提交的作业数量与已完成的作业数量,并使用这些数字相等的情况作为终止条件。
我已经使用java.util.concurrent 实现了一个完整的示例,它扩展了ThreadPoolExecutor 来实现这一点,并且专门化了作业队列以接受以特定方式排序的Comparable 实例。
-
TestExecutor.java:一个自定义执行器,它扩展了
ThreadPoolExecutor,但有额外的方法来执行可能会创建新作业的作业,以及一个等待所有提交的作业完成的新 await 方法。 -
WorkUnit.java:一个可比较的可运行作业示例,它可以创建新作业以提交给
TestExecutor。 -
Test.java:包含一个使用
WorkUnit实例和TestExecutor运行示例的 main 方法。
【问题讨论】:
标签: java multithreading concurrency producer-consumer java.util.concurrent