はい、これは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によって両方の呼び出し可能オブジェクトのメソッドにアクセスするためです。今それを理解しようとしています。