13

私は、主な目的が生の速度であるコンソール数独ソルバーを構築しています。

これで、WorkerThreadsを起動して各セルの隣接セルを計算するManagerThreadができました。そのため、現在、セルごとに1つのWorkerThreadが開始されています。作業が完了した既存のスレッドを再利用するにはどうすればよいですか?

スレッドプールパターンが解決策のようですが、ジョブが完了した後でスレッドが停止するのを防ぐために何をすべきかわかりません。

ps:この特定のタスクで多くのパフォーマンスが得られるとは期待していません。コードのより複雑な部分に適用する前に、マルチスレッドがどのように機能するかを実験したいと思います。

ありがとう

4

4 に答える 4

14

JavaSEが提供java.util.concurrentするAPIをご覧ください。を使用してスレッドプールを作成Executors#newFixedThreadPool()し、メソッドを使用してタスクを送信できExecutorServiceます。独自のスレッドプールを作り直す必要はありません。このテーマに関するSunのチュートリアルも参照してください。

于 2010-06-06T17:15:08.510 に答える
3

スレッドプール(java.util.concurrent)を使用する場合、実際にスレッドを初期化することはなく、Runnablesをスレッドプールに渡します。スレッドのライフサイクルについて心配する必要はありません。ランナブルで実行する必要のある作業をすべて実行し、実行が完了したらスレッドを終了させます。

于 2010-06-06T17:15:19.400 に答える
1

CyclicBarrierシンクロの使用について調べてください:http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CyclicBarrier.html

于 2010-06-06T21:58:52.177 に答える
0

OpenSymphonyのQuartzのようなパッケージを使用する代わりに、このロジックを自分でコーディングする必要がある場合は、次のようにします。Threadを拡張するWorkerThreadがあります。このクラスには、Runnableと呼ばれるrunnableというプライベートプロパティもあります。このプロパティは、実行するコードへの参照を保持します。パブリックセッターを用意してください。メインスレッドコードは、初期化したランナブルを実行することから始まり、待機状態に切り替わります。それを行う前に、プールマネージャーに終了したことをマークし、プールに戻すことができます。次にスレッドが必要になったときは、プールから1つを選択し、setRunnableを呼び出して、プロパティを実行可能に設定してから、スレッドをウェイクアップします。スポーンして動作し、無限ループに入ります。実行して実行可能になり、待機状態に戻ります。

于 2010-06-06T21:56:46.020 に答える