4

私は最近FilthyRichClientsを読んいて、Javaのバージョンは6ですが、並行フレームワークについての言及がないことに気づきました。したがって、彼らはjava.util.Timerとjavax.swing.Timerについて話しますが、ExecutorServiceについては話しません。

「 JavaタイマーとExecutorService 」の質問でExecutorServiceの利点について読み、前者よりも後者を使用することにしました。しかし、この本はjavax.swing.Timerについて説明しており、Swing開発に固有であるという利点があります。

つまり、Swing開発(アニメーションボタンなど)の場合、javax.swing.Timerが依然として優れた選択肢であるということですか、それとも新しいConcurrent Frameworkにそれに代わる関連クラスがあるのでしょうか?

4

3 に答える 3

6

Swing Timer は少なくとも EDT で実行されるため、invokeLater の呼び出しですべてをラップする必要はありません。また、Actions、ActionListeners、およびその他の Swing 関連クラスを使用するため、Swing とうまく連携します。

Swing 関連のタスクには Swing Timer を使い続け、GUI の更新を必要としないタスクには新しい並行パッケージを使用します。

Using Timers in Swing Applicationsを見てください。決定を揺るがす (申し訳ありません) ための詳細情報が含まれている可能性があります。

于 2009-01-06T15:42:51.690 に答える
5

単純なスイング関連のものについては、ここでjavax.swing.Timer述べた利点があるため、より良い選択だと思います。

Swing タイマーのタスクは、イベント ディスパッチ スレッドで実行されることに注意してください。これは、タスクがコンポーネントを安全に操作できることを意味しますが、タスクを迅速に実行する必要があることも意味します。

一方、swing に関連しない、またはより複雑で長い処理操作を実行する必要がある場合は、ExecutorServiceは非常に堅牢であり、間違いなく最適な方法です。

于 2009-01-06T15:43:19.723 に答える
1

ブルーノがアドバイスしたことを詳しく説明した単なる提案です。Swing を壊さずに優れた Java 1.5+ 同時実行ユーティリティを利用するための 1 つのパターンは、ExecutorService(ブルーノが言ったように) すべての面倒な作業を自分で行うことですが、それが完了したら、ExecutorServiceスレッドはハンドオフする必要があります。次のいずれかを使用して、Runnable 内の AWT スレッドへの実際の UI コンポーネントとのやり取り:

  • javax.swing.SwingUtilities.invokeAndWait(Runnable doRun)
  • javax.swing.SwingUtilities.invokeLater(Runnable doRun)

これらのメソッドは、AWT スレッドによって実行されるランナブルを渡します。

于 2009-01-06T16:05:16.403 に答える