我有几个使用 ArrayBlockingQueue 的工人。
每个工作人员从队列中取出一个对象,对其进行处理,结果可以获得多个对象,这些对象将被放入队列中以进行进一步处理。所以,工人=生产者+消费者。
工人:
public class Worker implements Runnable
{
private BlockingQueue<String> processQueue = null;
public Worker(BlockingQueue<String> processQueue)
{
this.processQueue = processQueue;
}
public void run()
{
try
{
do
{
String item = this.processQueue.take();
ArrayList<String> resultItems = this.processItem(item);
for(String resultItem : resultItems)
{
this.processQueue.put(resultItem);
}
}
while(true);
}
catch(Exception)
{
...
}
}
private ArrayList<String> processItem(String item) throws Exception
{
...
}
}
主要的:
public class Test
{
public static void main(String[] args) throws Exception
{
new Test().run();
}
private void run() throws Exception
{
BlockingQueue<String> processQueue = new ArrayBlockingQueue<>(10000);
processQueue.put("lalala");
Executor service = Executors.newFixedThreadPool(100);
for(int i=0; i<100; ++i)
{
service.execute(new Worker(processQueue));
}
}
}
当没有更多工作时,停止工人的最佳方法是什么?
首先,我的想法是定期检查队列中有多少项目以及当前正在处理的项目数量。如果两者都为零,则在 ExecutorService 上执行类似“shutdownNow()”的操作。但我不确定这是最好的方法。