私はJavaフラクタルエクスプローラーを書いていますが、フラクタル計算はマルチスレッドで行われます。以前は、多数のスレッド(システムにプロセッサコアがある数)を作成して配列に保持していましたが、これによりいくつかの問題が発生し、あまりエレガントではないため、エグゼキュータに切り替えたいと思います。
必要な機能は次のとおりです。
- ユーザーはいつでもフラクタル画像の新しい領域を選択してズームインできるため、いつでも計算をキャンセルして、すぐに新しいタスクを再挿入できるはずです。
- パフォーマンスを向上させるには、スレッドを再利用する必要があります(キャンセル後も存続します)
私の問題は、shutdownNow()の呼び出し(キャンセル)後に新しいタスクを送信すると、Java ExecutorService(Executors.newFixedThreadPool()を使用)が例外をスローすることです。もちろん、新しいExecutorServiceを作成することもできますが、その場合はすべてのスレッドを再度作成する必要があります。これは、私が理解している限り、非常にコストがかかります(これがスレッドプールを使用するポイントです)。
つまり、基本的に必要なのは、シャットダウンせずにキャンセルできるスレッドプールを使用したExecutorServiceの実装であり、再利用できます。
すでにそのようなものはありますか、それとも私はそれを自分で書く必要がありますか?(難しいことはありませんよね?;))
私の現在のコードはhttps://github.com/lucaswerkmeister/JFractalizerにあります。
前もって感謝します、
ルーカス
PS:エグゼキュータを使用する場合、スレッドよりも多くの部分に画像を分割するため、1つの部分がはるかに速く終了した場合、スレッドはアイドル状態ではなく、代わりに画像の別の部分に進むことができます。それでも、すべての部分が並行して計算され、一部が他の部分より遅く開始されない場合はクールですが、それは単なるボーナスです。