デスクトップの Java 1.5 アプリケーション (多くの MacOS X マシンで実行する必要があるため、Apple の方針により 1.6 VM が表示されることはありません) では、EDT の外で長い計算を実行する正しい方法は何ですか?
たとえば、ユーザーが操作を開始するボタンをクリックすると、EDT で通知を受け取り、何らかのメソッド (たとえばcrunchData()
) を実行したいとします。
これを行う1つの方法は次のとおりです。
final Thread t = new Thread( new Runnable() {
public void run() {
crunchData();
}
} );
t.start;
つまり、これは私が望むことですが、ユーザーが長時間実行される可能性のあるタスクを開始するたびに、上記のイディオムを使用します。そして、私は常に不必要に多くのタスクを作成しているように感じます (さらに、操作が長くなる場合もあれば、長くならない場合もあり、このような場合はアプリにできるだけ責任を負わせたいと思います)。
それを行う別の方法は、別の (非 EDT) スレッド (またはスレッドのプール) を常に実行し、たとえばブロッキング キューで待機し、Runnableを実行することです。手術。
これに対処する正しい方法は何ですか?
編集:インストールが簡単なものを処理する正しい方法はありますSwingWorker
か? SwingWorker
来る前に、人々はこれにどのように対処していましたか (これはかなり基本的なことのように思えます) 。