はい、これはJavaの生産者/消費者に関するもう1つの質問です。
私の変種は、N個のプロデューサーがproduceDataRows
メソッドによって開始され、M個のコンシューマーがconsumeDataRows
メソッドによって開始されることです。どちらのメソッドも、クラスの独自のインスタンスを開始しThreadPoolExecutor
、それぞれの数のプロデューサー/コンシューマータスクを送信してから、エグゼキューターが完了するまで待機します。
だから、ここに私のコードがあります:
final BlockingQueue<Row> allRows = new LinkedBlockingQueue<Row>();
ExecutorService exec = Executors.newFixedThreadPool(2);
FutureTask<Object> producer = new FutureTask<Object>(new Callable<Object>() {
@Override
public Object call() throws Exception {
produceDataRows(allRows);
return null;
}
});
FutureTask<Object> consumer = new FutureTask<Object>(new Callable<Object>() {
@Override
public Object call() throws Exception {
consumeDataRows(allRows);
return null;
}
});
exec.execute(producer);
exec.execute(consumer);
producer.get();
consumer.get();
問題はそれconsumer.get()
が戻ることですが、consumeDataRows
決して呼び出されません。一方produceDataRows
、はと呼ばれます。
私は何が欠けていますか?
ありがとう。
編集1
グレイの返事に続いて、私はコードを次のように書き直しました。
ExecutorService exec = Executors.newFixedThreadPool(2);
Callable<Object> producer = new Callable<Object>() {
@Override
public Object call() throws Exception {
produceDataRows(allRows);
return null;
}
};
Callable<Object> consumer = new Callable<Object>() {
@Override
public Object call() throws Exception {
consumeDataRows(allRows);
return null;
}
};
exec.submit(producer);
exec.submit(consumer);
exec.shutdown();
exec.awaitTermination(10, TimeUnit.DAYS);
同じ効果-コードは終了しますが、consumeDataRows
呼び出されることはありません。ここには3つの異なるThreadPoolExecutorインスタンスがあります。1つはここにproduceDataRows
、もう1consumeDataRows
つはここに、最後のインスタンスはここにあります。
ありがとう。
編集2
私のメソッドに何か問題があります。produceDataRows
コメントアウトすると、実行call
によって両方の呼び出し可能オブジェクトのメソッドにアクセスするためです。今それを理解しようとしています。