私はswingを使用しています。私のアプリケーションでは、5秒ごとにインターネット接続をチェックして、ファイルシステムの変更を監視するような多くのスレッドを並列に実行する必要がありました。ExecuterServiceを使用した複数のSwingWorkersが正常に動作しない
上記のような時間がかかる作業はすべて、SwingWorker
で実行されているため、GUIがフリーズしないようにしてください。
同じ時間私は、サーバーにファイルをアップロードするなどの他の時間がかかる作業を実行する必要があります。この目的のために私はswingWorkerも使用しました。私はexecuterServiceにこれらのすべてのswingworkerをスレッドプーリング用に提出し、互いに影響しないようにします。
私のエグゼクティブサービスはこのようなものです。私は30スレッドで十分だろうと思った。
static ExecutorService threadExecutor;
threadExecutor = Executors.newFixedThreadPool(30);
その後、同じサービスでスレッドを送信します。
threadExecutor.submit(monitorinternetconnectivity); //submitting swingworker obejct
私は開始時に提出し、いくつかの私は、実行時に追加したとき、それは仕事を完了するか、インターネット接続の監視のように、自分の仕事の実行を停止しません、ランタイムを追加するスレッドの一部
。スイングワーカーや複数のスイングワーカーを使用するための最良の方法など、同じ機能を使用する方法はありますか。そして、私たちは
私は 'SwingWorker'の実行を' ExecutorService'に委譲する理由を理解していません。 'SwingWorker'は現在のスレッドをブロックしません。なぜなら、バックグラウンドスレッドが完了するまでそのすべての作業を行うからです。それが完了すると、タスクはEDTで実行されます。 – user1329572
ジョブが進行中のタスクの場合、 'ExecutorService'は間違ったツールです。長時間実行されるタスクは独自のスレッドを必要とします。スレッドプールのメリットはありません。ただし、プール内のすべてのスレッドが進行中のタスクを実行しているためキュー内で待機しているタスクになります。 –
最後に私自身の実験で調べたところ、SwingWorkersは10スレッドの制限付きスレッドプールを使用しています。これが一般的なルールかどうかはわかりませんが、テストプログラムを作成して、自分の環境で何が起きているかを確認するのは簡単でしょう。 –