はい。SwingWorker
行く方法です。
に慣れていない場合SwingWorker
、これは基本的に長時間実行される計算を実行できるクラスです。彼らは、完了したときに結果を出すか、途中で中間結果を公開することができます。これは基本的にあなたがやろうとしていることです.
Javaチュートリアルのセクション「中間結果を持つタスク」から:
バックグラウンド タスクがまだ動作している間に中間結果を提供すると便利なことがよくあります。タスクは、SwingWorker.publish を呼び出すことでこれを行うことができます。このメソッドは、可変数の引数を受け入れます。各引数は、SwingWorker の 2 番目の型パラメーターで指定された型でなければなりません。
例: _
private class FlipTask extends SwingWorker<Void, FlipPair> {
@Override
protected Void doInBackground() {
long heads = 0;
long total = 0;
Random random = new Random();
while (!isCancelled()) {
total++;
if (random.nextBoolean()) {
heads++;
}
// Here's your interim result, your "first return statement"
publish(new FlipPair(heads, total));
}
return null;
}
@Override
protected void process(List<FlipPair> pairs) {
FlipPair pair = pairs.get(pairs.size() - 1);
headsText.setText(String.format("%d", pair.heads));
totalText.setText(String.format("%d", pair.total));
devText.setText(String.format("%.10g",
((double) pair.heads)/((double) pair.total) - 0.5));
}
}
何らかの理由で を使用できない場合はSwingWorker
、非同期スレッドを使用してこれを行う必要があります。次のようなものを試すことができます:
interface Callback {
public void computationComplete(Result r);
}
public Result doComputation(final Callback c) {
// Do computation
new Thread(new Runnable() {
@Override
public void run() {
// Complete computation
c.computationComplete(finalResult);
}
}).start();
return firstResult;
}
しかし、これは基本的に車輪の再発明です。