4

実行する必要のあるタスクには、外部サーバーからのデータの要求、データに対する(かなり長い)処理の実行、および処理の結果でGUIを更新することが含まれます。サーバーが応答しない可能性があるため、タスクはSwingWorkerに適しています。doInBackground()メソッドが結果を取得し、doneメソッドがGUIを更新します。

これは数秒に1回発生する必要があります。whileループとThread.sleepを使用して、スリープするたびに新しいSwingWorkerを作成できることはわかっています。しかし、私が読んだものはすべて、ループと睡眠を使用すると眉をひそめます。タイマーを使いたいのですが:

  • スイングタイマーの使用は逆効果のようです。それらはEDTで実行されるため、基本的にSwingWorkerのdoInBackgroundメソッドを使用する理由はありません。サーバーが応答しない場合、GUIは応答しません。

  • java.util.Timerを使用すると、少し無駄に思えます。TimerTask()のバックグラウンドスレッドが作成されるようです。実際の作業を行うためにSwingWorkerを作成しているだけなので、基本的に、別のスレッドを作成するバックグラウンドスレッドを作成しています。バックグラウンドスレッド。

誰かが私に最善の解決策を教えてもらえますか?SwingWorkerはタスクに最適であると思われるので、これを使い続けたいと思いますが、手伝うことができれば、whileループの使用は避けたいと思います。

ありがとう

4

4 に答える 4

2

あなたはScheduledExecutorServiceを使うことができます:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 

// get a scheduled executor service with one thread
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
// schedule the worker at an intervall of 5 seconds
scheduler.scheduleAtFixedRate(myWorker, 0, 5, TimeUnit.SECONDS);
于 2011-05-16T10:00:28.180 に答える
2

Swing Timer を使用して Swing Worker を開始できない理由がわかりません。何を試しましたか?

于 2011-05-16T10:44:42.600 に答える
1

あなたは SwingWorker で正しい方向に進んでいると思います。ここで、そのパブリッシュおよびプロセス メソッドを確認する必要があります。処理が進むにつれて、バックグラウンド スレッドからオブジェクトを publish() すると、Swing(EDT) スレッドで process() メソッドが呼び出されるため、GUI を更新できます。

この方法では、調整するタイマーやその他のスレッドがたくさんありません。

javadocs には、素数を使用した簡単な例があります: http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

于 2011-05-23T16:03:08.487 に答える
0

取得するデータ セットの大きさは? かなり小さい場合は、フェッチ/処理と表示のタスクを完全に切り離します。

  1. ある種のメモリ内キャッシュを使用して、最近処理された一連のデータを保持します。
  2. a を使用javax.swing.Timerして、キャッシュされたデータで GUI を更新します。
  3. を使用しjava.util.Timerてデータベースからデータを取得し、処理してキャッシュを更新します。
  4. キャッシュ上の 2 つの時間の間の同期の問題に注意してください。他のタイマーがデータを更新しているのと同時に、スイング タイマーがデータを取得することは望ましくありません。
于 2011-05-16T10:54:01.833 に答える