1

新しいスレッドにタスクをディスパッチしたいのですが、このタスクが実行のさまざまな段階で親スレッドに通知するようにしたいのです。以下に示すようなもの:

void unzip(Path source, Path destination, ObserverThread observer) {
  int n = compute number of entries;
  observer.notify("n: " + n);
  while (there are more entries) {
    observer.notify("Unzipping " + name of entry);
    unzip the entry;
  }
  observer.notify("done");
}

このユースケースの標準ライブラリのみのソリューションは何でしょうか?(外部依存関係にしたい。)

4

2 に答える 2

1

これをSwingで使用している場合は、SwingWorker(Javaの一部)を使用する必要があります。バックグラウンドで作業をしながら中間結果を公開する方法の例があります。

Swingを使用していない場合、標準のJavaにはExecutorsクラスが付属しています。シングルスレッドExecutorServiceを作成し、それにRunnableを送信できます。進行中の結果を公開する方法は提供されていませんが、例に示すように手動でコールバックを実行できます。

于 2012-06-05T15:52:11.807 に答える
1

考えられる1つの方法は、ある種のブロッキングキューを使用することです。親は、新しいメッセージを受信するために定期的にpollまたはpeekキューにいます(とにかく、イベントをリッスンするなど、何をするにも散在しています)。

「子」スレッドはadd、親がタイムリーにメッセージを削除すると仮定すると、単にメッセージをキューに送信します。

ここでは、親スレッドと子スレッドを並行して実行する必要があると想定しています。つまり、子から新しいメッセージが到着するまで親スレッドをブロックすることはできません。とにかく、その場合に別の子スレッドを持つことのポイントは何でしょうか。

ブロッキングキューを使用すると、親がメッセージを消費するよりも速く子がメッセージを生成した場合でも、メモリ使用量は制限されたままになり、親が最終的にスペースを空けるまで、子はある時点で待機する必要があります。再びキュー。

別のアプローチは、親がメッセージを十分に速く消費できないときに、メッセージの破棄を開始することです。

于 2012-06-05T08:57:34.877 に答える