2

私はJavaフラクタルエクスプローラーを書いていますが、フラクタル計算はマルチスレッドで行われます。以前は、多数のスレッド(システムにプロセッサコアがある数)を作成して配列に保持していましたが、これによりいくつかの問題が発生し、あまりエレガントではないため、エグゼキュータに切り替えたいと思います。

必要な機能は次のとおりです。

  • ユーザーはいつでもフラクタル画像の新しい領域を選択してズームインできるため、いつでも計算をキャンセルして、すぐに新しいタスクを再挿入できるはずです。
  • パフォーマンスを向上させるには、スレッドを再利用する必要があります(キャンセル後も存続します)

私の問題は、shutdownNow()の呼び出し(キャンセル)後に新しいタスクを送信すると、Java ExecutorService(Executors.newFixedThreadPool()を使用)が例外をスローすることです。もちろん、新しいExecutorServiceを作成することもできますが、その場合はすべてのスレッドを再度作成する必要があります。これは、私が理解している限り、非常にコストがかかります(これがスレッドプールを使用するポイントです)。

つまり、基本的に必要なのは、シャットダウンせずにキャンセルできるスレッドプールを使用したExecutorServiceの実装であり、再利用できます。

すでにそのようなものはありますか、それとも私はそれを自分で書く必要がありますか?(難しいことはありませんよね?;))

私の現在のコードはhttps://github.com/lucaswerkmeister/JFractalizerにあります。

前もって感謝します、

ルーカス

PS:エグゼキュータを使用する場合、スレッドよりも多くの部分に画像を分割するため、1つの部分がはるかに速く終了した場合、スレッドはアイドル状態ではなく、代わりに画像の別の部分に進むことができます。それでも、すべての部分が並行して計算され、一部が他の部分より遅く開始されない場合はクールですが、それは単なるボーナスです。

4

2 に答える 2

2

を使いExecutorService.html#shutdownNow()終わって、ExecutorService新しいタスクを送信する予定がない場合に使用する必要があります。

同じものを使い続けたい場合はExecutorService、個々のタスクをキャンセルする必要があります。

メソッドは、実行をキャンセルしたり、完了を待機したりするために使用できるをExecutorService.html#submit返します。Future

于 2012-12-02T17:33:16.500 に答える
1

タスクは割り込みを処理できる必要があります。したがって、タスクを中断することでタスクをキャンセルできます。

  boolean flag = Thread.interrupted();
  if(flag == true )
      throw new InterruptedException();
于 2012-12-02T17:34:21.733 に答える