レポートの実行を変更して、並行して実行しようとしています。「シリアル モード」では実行テストに 30 秒かかり、同時実行モードを使用すると 27 秒かかります (シリアルでいくつかの手順を実行する必要があることを考慮してください。結果は問題ありません)。
私がまだ得ていないのは、この行です:
ExecutorService executor = Executors.newFixedThreadPool(4);
私のコンピューターは 2x2.6 Ghz クアッド コアで武装しており、newFixedThreadPool が高い (16) 場合、実行時間が減少すると予想されます。実際には、newFixedThreadPool を増やすほど、実行が遅くなります。これは疑問を投げかけます:私は何を間違っているのか、何を理解できていないのでしょうか?!?!
実行結果のスクリーンショットを 2 つ埋め込んでいます。
A. newSingleThreadExecuter - 23 秒で実行
B. newFixedThreadPool(4) - 43 秒で実行されます。
「Worker」を送信するたびに、system.out で currentTimeMillis を取得し、「fatched tkt」の結果は、データベースからデータを取得するのにかかるミリ秒です。(戦略 A では最大 3 ミリ秒、戦略 B では最大 7 ミリ秒かかります)。
Stopper stopper = new Stopper();
for (Long iNum : multimap.asMap().keySet())
{
List<Long> tickets = (List<Long>) multimap.get(iNum);
for (Long ticketNumber : tickets)
{
pojoPks = getPkData(iNum);
Callable<PojoTicket> worker = new MaxCommThread(ticketNumber, pojoPks);
Future<PojoTicket> submit = executor.submit(worker);
futures.add(submit);
}
}
System.out.println("futurues: " +futures.size());
for (Future<PojoTicket> future : futures)
{
try
{
PojoTicket pojoTicket = future.get();
//do the rest here
} catch (InterruptedException e)
{
System.out.println("---------------------->InterruptedException");
} catch (ExecutionException e)
{
System.out.println("---------------------->ExecutionException");
}
}
executor.shutdown();
stopper.stop();