私は、独自のSwingWorker拡張クラスの中で、それぞれ別々のタスクを実行するJava GUI駆動型アプリケーションを設計しています。これは私が自分のスレッドでタスクを実行し、GUIを更新するために自由にEDTを保つために使用する通常のデザインです。各SwingWorkerは、Executors.newCachedThreadPoolを使用して独自のスレッドで開始されます。Java Swingworkerと複数のスレッド
しかし、ある特定のクラスでは、処理にかなりの時間を要するタスクがあります。タスクには、最大6回の計算を実行するforループが含まれています。
処理時間を短縮するために6つの計算をそれぞれ独自のスレッド内で実装する考えがありましたが、これを実装する最善の方法はわかりません。
SwingWorkerを拡張してRunnableを実装し、forループ内でvoid Run()メソッドを使用したり、毎回新しいスレッドを開始したり、cachedThreadPoolを使用したりすることは可能ですか?
または、標準のThread()実装を使用するほうがよいですか?
ご意見やご提案をいただければ幸いです。事前に
おかげ
ジョシュ
*「処理時間を短縮するために6つの計算をそれぞれのスレッド内で実装する考えがありました」* [sic] ... CPUバインドされたアプリケーションを高速化するこの種の並列計算は、あなたのアプリケーションを実行しているCPUがあなたのJavaアプリケーションで利用可能なコアが少なくとも6つあれば、スピードアップが可能です。あなたが2つのコアだけを持っているならば、2つではなく6つのスレッドを生成すると実際にあなたのプログラムは遅くなるはずです... – TacticalCoder
ああ、それは完璧な意味があります!! ありがとうございます。 –
@ user988052これは意味をなさない。 xスレッドがある場合は、プログラムを高速に実行するために必ずしもxコア以上が必要なわけではありません。 JVMに使用可能な論理CPUが2つ以上ある限り、OSはそれらの論理CPUにスレッドを分散しようとします。より論理的なCPU - > CPUあたりのスレッド数が少なくなります - >>がより速く終了します。それはそれよりもはるかに複雑なことがあります(例えば、いくつかのロックが関わっている場合)、私は知っていますが、通常このように動作します。 –