質問
最近 Filthy Rich Clients を読んでいて、Javaのバージョンは6ですが、コンカレントフレームワークについては言及されていません。そのため、彼らはjava.util.Timerとjavax.swing.Timerについて話しますが、ExecutorServiceについては話しません。
質問" Java Timer vs ExecutorService &quotでExecutorServiceの利点について読みました;前者よりも後者を使用することにしました。しかし、この本はjavax.swing.Timerについて述べており、Swing開発に特化することの利点です。
つまり、これは、Swing開発(アニメーションボタンなど)の場合、javax.swing.Timerが依然としてより適切な選択肢であるか、それを置き換える新しいConcurrent Frameworkに関連するクラスがあるということですか?
解決
まあSwing Timerは少なくともEDTで実行されるので、invokeLaterの呼び出しですべてをラップする必要はありません。また、Actions、ActionListeners、およびその他のSwing関連クラスを使用するため、Swingとうまく連携します。
Swing関連タスクにはSwing Timerを使い続け、GUIの更新を伴わないものには新しい並行パッケージを使用します。
そのまま Swingアプリケーションでのタイマーの使用をご覧ください決定を振る(申し訳ありませんが)ための詳細情報が含まれている可能性があります。
他のヒント
単純なスイング関連のものについては、こちら。
Swingタイマーのタスクは イベントディスパッチで実行 糸。これは、タスクができることを意味します コンポーネントを安全に操作しますが、 また、タスクは 迅速に実行します。
反対に、スイングに関連しない、またはより複雑で長い処理操作を実行する必要がある場合、 ExecutorService
は非常に堅牢であり、間違いなく進むべき方法です。
brunoがアドバイスしたことを詳しく述べた提案ですが、Swingを中断せずに優れたJava 1.5+同時実行ユーティリティを利用するパターンの1つは、 ExecutorService
にすべての面倒な作業をさせることです(brunoが言ったように)ただし、それが完了したら、 ExecutorService
スレッドは、実際のUIコンポーネントとの対話を、次のいずれかを使用してRunnableのAWTスレッドに渡す必要があります。
-
javax.swing.SwingUtilities.invokeAndWait(Runnable doRun)
-
javax.swing.SwingUtilities.invokeLater(Runnable doRun)
これらのメソッドは、AWTスレッドによって実行されるランナブルを渡します。