2012-02-10 19 views
7

私は、独自のSwingWorker拡張クラスの中で、それぞれ別々のタスクを実行するJava GUI駆動型アプリケーションを設計しています。これは私が自分のスレッドでタスクを実行し、GUIを更新するために自由にEDTを保つために使用する通常のデザインです。各SwingWorkerは、Executors.newCachedThreadPoolを使用して独自のスレッドで開始されます。Java Swingworkerと複数のスレッド

しかし、ある特定のクラスでは、処理にかなりの時間を要するタスクがあります。タスクには、最大6回の計算を実行するforループが含まれています。

処理時間を短縮するために6つの計算をそれぞれ独自のスレッド内で実装する考えがありましたが、これを実装する最善の方法はわかりません。

SwingWorkerを拡張してRunnableを実装し、forループ内でvoid Run()メソッドを使用したり、毎回新しいスレッドを開始したり、cachedThreadPoolを使用したりすることは可能ですか?

または、標準のThread()実装を使用するほうがよいですか?

ご意見やご提案をいただければ幸いです。事前に

おかげ

ジョシュ

+7

*「処理時間を短縮するために6つの計算をそれぞれのスレッド内で実装する考えがありました」* [sic] ... CPUバインドされたアプリケーションを高速化するこの種の並列計算は、あなたのアプリケーションを実行しているCPUがあなたのJavaアプリケーションで利用可能なコアが少なくとも6つあれば、スピードアップが可能です。あなたが2つのコアだけを持っているならば、2つではなく6つのスレッドを生成すると実際にあなたのプログラムは遅くなるはずです... – TacticalCoder

+0

ああ、それは完璧な意味があります!! ありがとうございます。 –

+0

@ user988052これは意味をなさない。 xスレッドがある場合は、プログラムを高速に実行するために必ずしもxコア以上が必要なわけではありません。 JVMに使用可能な論理CPUが2つ以上ある限り、OSはそれらの論理CPUにスレッドを分散しようとします。より論理的なCPU - > CPUあたりのスレッド数が少なくなります - >>がより速く終了します。それはそれよりもはるかに複雑なことがあります(例えば、いくつかのロックが関わっている場合)、私は知っていますが、通常このように動作します。 –

答えて

5

user988052は当然の権利である - あなたが実際にあるため、オーバーヘッドのアプリケーションを遅くする6つの異なるスレッドで計算を行って、マルチコアCPUを持っていない場合スレッドの作成と管理が行われます。

この計算を6つの別々のスレッドで実行したい場合は、管理スレッドとしてSwingWorkerを使用し、その中に5-6の新しいスレッドを生成することができます。 ExecutorServiceを使用すると、スレッドのプールを使用するため、スレッドの作成と廃棄に伴うオーバーヘッドが最小限に抑えられます。

編集:あなたのコメントに答えるために:

私は最善の方法は、(6つの計算のそれぞれを個別に実行できるように)、単にExecutorServiceを使用し、その後、Runnableであなたの計算を実装するあなたをインスタンス化することだと思いますRunnableを6回使用してExecutorService.submit(Runnable task)を使用してください。これはすべてSwingWorker.doInBackground()メソッド内で実行できます。

あなたはrun()メソッドをあなた自身で呼び出すべきではありません。スレッド/ ExecutorServiceによって行われるようにしてください。

+0

私はswingworkerクラス内でrunメソッドを作成し、Executorを使って新しいスレッドを実行するたびにrunメソッドを呼び出す必要がありますか? –

+0

あなたのコメントへの回答は私の編集をご覧ください。 – mort

+0

私は、計算がどれくらいの時間かかると思いますか、それはかなり異なると思います。約2秒の計算時間について話しているなら、おそらく6スレッドを使うのは良い考えではないでしょう。しかし、それ以上の場合(10秒、30秒、1分、5分など)、6つのスレッドが理にかなっています。 6つのスレッド間の作成/管理/切り替えによって生成されるすべてのオーバーヘッドは、今日では計算上SOOOOOOであり、問​​題ではないということは最近安いです。 6つのスレッドを作成する方が理にかなっていると思われる場合は、実行してください。ユーザーがデュアルコア/トリプルコア/クアッドコア/その他を使用している場合は、速度アップする可能性もあります。 CPU。 –

関連する問題