12

を使用しExecutorServiceて3スレッドプールを実装し、CountDownLatchを使用してすべてのスレッドの完了を監視し、さらに処理します。

ExecutorService threadExecutor = Executors.newFixedThreadPool(3);
CountDownLatch countDownLatch = new CountDownLatch(3);

AuthorisationHistoryTask task1 =
    new AuthorisationHistoryTask(commonDataThread, countDownLatch );
PreAuthHistoryTask task2 = 
    new PreAuthHistoryTask(userID,sessionID, commonDataThread, countDownLatch );

SettlementHistTask task4 = new SettlementHistTask(commonDataThread,countDownLatch);

Future<Map<String, Object>> futureAuthHistory = threadExecutor.submit (task1);
Future<Map<String, Object>> futurePreAuthHist = threadExecutor.submit (task2);
Future<Map<String, Object>> futureSettleHist = threadExecutor.submit(task4);

threadExecutor.shutdown();

try {
     countDownLatch.await();
}catch (InterruptedException e) { 
     logger.logCommon("InterruptedException",CLASS_NAME);                     
}catch (ExecutionException ex) { 
     logger.logCommon("InterruptedException",CLASS_NAME); 
}

私はcountDownLatch.await()すべてのスレッドが完了するまで待っていました。countDownLatch.await()タイムアウトが45秒の場合、このプロセスを中止したいと思います。どうすればこれを実装できますか?

4

1 に答える 1

29

awaitタイムアウトを受け入れるオーバーロードされたバリアントを使用します。

countDownLatch.await(45, TimeUnit.SECONDS);
于 2013-03-06T11:13:54.057 に答える