2016-11-24 5 views
1

スレッドプールエグゼキュータがメインスレッドと並列に実行されています。メインスレッドは、エグゼキュータのシャットダウンまで待機しません。ThreadpoolExecutorとメインスレッドが並列に実行する

executorスレッドの実行中にメインスレッドを待機させるためにwhileループを使用しました。しかし、それは助けにはならない。メインスレッドを待ち受ける方法を教えてください。

while(!tp.isShutdown()){ 

       } 

答えて

1

またこれらのランナブルを提出し、完了するためにそれらを待つことができます。また、例外をスローする前にスレッドが実行されるのを待つタイムアウトを指定することもできます。

List<Future<ParallelExecutor>> tasks = new ArrayList<>(); 
ExecutorService tp = Executors.newFixedThreadPool(10); 
for (final TableInfo table : commandList) { 
    ParallelExecutor pe = new ParallelExecutor(table); 
    tasks.add(tp.submit(pe)); 
} 

for (Future<ParallelExecutor > p : tasks) { 
    p.get(); // with timeout p.get(10, TimeUnit.SECONDS); 
} 

tp.shutdown(); 
2

もちろん、それは待っていません。それはスレッドプールを作成するという完全な考え方なので、メインスレッドはスレッドプールが追加のタスクを実行している間に他のタスクを実行できます。

awaitTermination(long timeout, TimeUnit unit)メソッドを使用すると、スレッドプールがタスクを完了している間にメインスレッドを一時停止させることができます。

+0

問題は、私が実行しているタスクが長時間実行されていることと、これらのタスクがいつ完了するかわかりません。だから、私はタイムアウトを提供することはできません。 –

+0

@angularBeginnerなぜですか?確かに彼らは10年足らずで終わることを知っているでしょう。 – Kayaman

3

shutdown()を呼び出した後、awaitTermination(long timeout, TimeUnit unit)を使用すると、すべてのタスクの実行が完了するまで呼び出しスレッドをブロックできます。

タイムアウトとして、値が大きすぎるとタスクを完了するのに必要な時間だけ待つことができますが、タスクが終了しない場合はスレッドを永久に待機させる可能性があります。異常に長すぎるといくつかのタスクを実行するための合理的なタイムアウトです。例えば

tp.shutdown(); 
tp.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
関連する問題