ExecutorService と ArrayBlockingQueue を使用して、プロデューサーとコンシューマーの設計に関する私の理解が正しいかどうかを知りたいです。この設計を実装するにはさまざまな方法があることは理解していますが、最終的には問題自体に依存すると思います。
私が直面しなければならなかった問題は次のとおりです。大きなファイル (6 GB) から読み取る 1 つのプロデューサーがいます。行ごとに読み取り、すべての行をオブジェクトに変換します。オブジェクトを ArrayBlockingQueue に配置します。
コンシューマー (少数) は ArrayBlockingQueue からオブジェクトを取得し、これをデータベースに永続化します。
さて、明らかに生産者は消費者よりもはるかに高速です。各行をオブジェクトに変換するのに数秒かかりますが、消費者にとってはより長い時間がかかります。
したがって...これを行うことでこのプロセスをスピードアップしたい場合: 2 つのクラス化された「ProducerThread」と「ConsumerThread」を作成し、それらは ArrayBlockingQueue を共有します。2 つの間で調整するスレッドは次のようになります。
@Override
public void run()
{
try{
ArrayBlockingQueue<Ticket> queue = new ArrayBlockingQueue<Ticket>(40);
ExecutorService threadPool = Executors.newFixedThreadPool(8);
threadPool.execute(new SaleConsumerThread("NEW YORK", queue));
threadPool.execute(new SaleConsumerThread("PARIS", queue));
threadPool.execute(new SaleConsumerThread("TEL AVIV", queue));
threadPool.execute(new SaleConsumerThread("HONG KONG", queue));
threadPool.execute(new SaleConsumerThread("LONDON", queue));
threadPool.execute(new SaleConsumerThread("BERLIN", queue));
threadPool.execute(new SaleConsumerThread("AMSTERDAM", queue));
Future producerStatus = threadPool.submit(new SaleProducerThread(progressBar, file, queue));
producerStatus.get();
threadPool.shutdown();
}catch(Exception exp)
{
exp.printStackTrace();
}
}
私の質問は次のとおりです。
上記の設計は実際に各スレッドを同時に使用しますか? 私のコンピューターは 2.4GHz クアッドコア 2 台です。
Future と .get() が何のためにあるのかわかりませんか?
ちなみに、結果は高速です (最初のバージョンはシーケンシャルで、3 時間かかったと考えてください)。今では 40 分ほどかかります (ただし、改善の余地があるかもしれません)。
ポインタをありがとう