ArrayBlockingQueue を使用するワーカーがいくつかあります。
すべてのワーカーはキューから 1 つのオブジェクトを取得して処理し、その結果、さらに処理するためにキューに入れられる複数のオブジェクトを取得できます。つまり、労働者=生産者+消費者です。
ワーカー:
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()」などを実行します。しかし、これが最善の方法であるかどうかはわかりません。