У меня есть несколько рабочих, которые используют 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));
}
}
}
Каков наилучший способ остановить работников, когда больше нет работы?
Во-первых, я имею в виду, периодически проверять, сколько элементов в очереди и сколько элементов в настоящее время находятся впроцесс.Если оба значения равны нулю, выполните что-то вроде shutdownNow () в ExecutorService.Но я не уверен, что это лучший способ.