2016-07-21 6 views
4

スレッドプールを使用してアイテムのリストを処理し、それらが完了するのを待っています。また、すべてが完了していない場合は、処理の4分後にそれをタイムアウトする必要があります。メインスレッドを使用しないフォークと結合

これは問題は時々このアプローチはawaitQuiescenceは、そのいずれかが完了するまで開始されないことを意味し、リスト項目のいずれかを処理するためにメインスレッドを使用することで、現時点で私が持っている

ForkJoinPool threadPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); 

list.forEach(entry -> threadPool.execute(() -> { 
    // processing 
})); 

if (!threadPool.awaitQuiescence(4, TimeUnit.MINUTES)) { 
    // send alert about delay 
} 

です。同じようなことができますが、メインスレッドを使用しないことを保証する他のスレッドプールがありますか、またはForkJoinPoolを構成しない方法がありますか?

+0

なぜ新しいスレッドで実行しないのですか?そして、「時にはメインスレッド上で実行される」というのは本当に意味をなさない。 'ForkJoinPool'がメインスレッドを使用するかどうかを選択するので、結果が矛盾していると言っていますか? –

+0

ForkJoinPoolが矛盾しているようです。私は、使用中のスレッドを記録する処理内にログを記録し、時にはForkJoinPool-1-worker- [n]と呼ばれるもののみを使用し、スレッドのうちの1つがそれをトリガしたものです。 – sparkdoo

+1

送信スレッドの使用を避ける方法はありません。私がここで指摘しているように、許容できるレベルのパフォーマンスを達成するには、送信スレッドが必要です。http://coopsoft.com/ar/Calamity2Article.html#submit – edharned

答えて

0

私は問題はあなたがまだメインスレッド内で(list.forEach)を反復していると思います。並列ストリームを使用して、プールに全体の計算を委任:

ForkJoinPool pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); 

pool.execute(() -> { 
    list.parallelStream().forEach(item -> { 
     // processing 
    }); 
}); 

if (!pool.awaitQuiescence(4L, TimeUnit.MINUTES)) { 
    // send alert about delay 
} 

私はForkJoinPoolと並列ストリームを使用する方法を参照してくださいthis question(および与えられた答えを)読んでお勧めします。

関連する問題