2016-07-20 12 views
-2

サイズ100のnewFixedThreadPoolを作成し、それに対して500スレッドを開始しました。 すべてのスレッドが正常に起動し、すべてのスレッドがすべて実行するのに十分な時間がかかります。しかし、エグゼキュータはただスレッドを生成して出力を停止し、そのほとんどはシャットダウンしません。 shutdown()とawaitTermination()をmax valueで呼び出したので、すべてのスレッドが終了するまで待つ必要があります。 タスクは、20または30のように、プールサイズが100で小さいタスクの数が少ない場合に問題ありません。 スレッドのロジックは、リストを操作してそのリストをxlsxファイルに変換することです。 誰かが似たような問題に直面した場合は、情報を共有してください。FixedThreadPoolが正しく実行されていません

答えて

1

ExecutorServiceにタスクをサブミットする際のよくある間違いは、発生したエラーを無視していることです。どちらかにする必要があります。

  • コールFuture.get()の各将来に関するおtry { } catch (Throwable t)ブロック内のすべてのエラーをキャッチし、ログインする必要が任意のエラーや
  • を見るために.submit(task)によって返されました。

エラーが発生し、すべてのタスクが失敗する可能性があります。

BTWタスクにCPUが割り当てられている場合は、最適なスレッド数がCPUの数になる可能性があります。

スレッド内のロジックは、リスト上で動作し、はるかに簡単なアプローチは、例えばparallelStreamを使用する可能性がある

を変換することです

listToProcess.parallelStream() 
      .map(l -> process(l)) 
      .forEach(row -> save(row)); 
+0

はい私はfuture.get()も同じ問題に直面しましたが、私は個々のスレッドにすべての例外も記録しました(実際には何もありませんでした)。私はthareds = CPUの数で試してみますが、CPUバインドされたタスクを実行しているかどうかはわかりません。 –

関連する問題