2012-04-23 5 views
4

私はswingを使用しています。私のアプリケーションでは、5秒ごとにインターネット接続をチェックして、ファイルシステムの変更を監視するような多くのスレッドを並列に実行する必要がありました。ExecuterServiceを使用した複数のSwingWorkersが正常に動作しない

上記のような時間がかかる作業はすべて、SwingWorkerで実行されているため、GUIがフリーズしないようにしてください。

同じ時間私は、サーバーにファイルをアップロードするなどの他の時間がかかる作業を実行する必要があります。この目的のために私はswingWorkerも使用しました。私はexecuterServiceにこれらのすべてのswingworkerをスレッドプーリング用に提出し、互いに影響しないようにします。

私のエグゼクティブサービスはこのようなものです。私は30スレッドで十分だろうと思った。

static ExecutorService threadExecutor; 
threadExecutor = Executors.newFixedThreadPool(30); 

その後、同じサービスでスレッドを送信します。

threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct 

私は開始時に提出し、いくつかの私は、実行時に追加したとき、それは仕事を完了するか、インターネット接続の監視のように、自分の仕事の実行を停止しません、ランタイムを追加するスレッドの一部

スイングワーカーや複数のスイングワーカーを使用するための最良の方法など、同じ機能を使用する方法はありますか。そして、私たちは

+1

私は 'SwingWorker'の実行を' ExecutorService'に委譲する理由を理解していません。 'SwingWorker'は現在のスレッドをブロックしません。なぜなら、バックグラウンドスレッドが完了するまでそのすべての作業を行うからです。それが完了すると、タスクはEDTで実行されます。 – user1329572

+0

ジョブが進行中のタスクの場合、 'ExecutorService'は間違ったツールです。長時間実行されるタスクは独自のスレッドを必要とします。スレッドプールのメリットはありません。ただし、プール内のすべてのスレッドが進行中のタスクを実行しているためキュー内で待機しているタスクになります。 –

+0

最後に私自身の実験で調べたところ、SwingWorkersは10スレッドの制限付きスレッドプールを使用しています。これが一般的なルールかどうかはわかりませんが、テストプログラムを作成して、自分の環境で何が起きているかを確認するのは簡単でしょう。 –

答えて

1
  1. SwingWorkerのは、それが自分のThreadPoolのだ使用していますexecuterサービスに、実行時に新しいswingwokersを追加することができるはずです。
  2. SwingWorkerは、GUIの更新が必要になってから、長時間実行されたタスク(つまり数ミリ秒以上必要なもの)に使用する必要があります。あなたは、一般的にEDT(hereを見て)の内側に形成Swingコンポーネントへのアクセスの規則に従っている場合EDT(つまりSwingWorker.done()メソッドから)

行われるべきである外

  • いいえGUI要素を更新するために呼び出しますロックに問題はないはずです。私はその問題があなたのコードにあると思うが、私たちはそれを見なければならないことを確かめる。