0

データを生成するメインからメソッドを実行しています。また、メソッドが書き込んでいるキューを監視するスレッドをフォークし、データがある場合はそれをディスクに保存します。

私の問題は、過去にマルチスレッド化して他のスレッドの寿命を監視できたことですが、それがメインメソッドだけの場合はどうすればよいかわかりませんか? メソッドがゆっくりとデータを生成し、sleep または !queue.empty() を使用しているという問題は、フォークされたファイル ライター プロセスが停止するキューを空にするとすぐに機能しません。

データを生成するメソッドでファイルに書き込むことができる最悪のケースはわかっていますが、それ以外に、別のメソッドがまだ実行されているかどうかを監視するためにできることはありますか?

4

2 に答える 2

1

の良い仕事のようですねExecutorService。メイン メソッドで作成します。

ExecutorService pool = Executors.newFixedThreadPool(10);

ExecutorService基本的に、キューとそのキューで待機している一連のスレッドのラッパーです (上記の例では 10)。何かがキューに表示される (送信される) 瞬間、ちょうど 1 つのスレッドがそれを取得します。

pool.submit(someWork);

someWorkたとえば、ディスクに書き込まれるデータと書き込み手順をラップする Runnable はどこにありますか。メイン スレッドでの作業が完了したら、poolに正常に終了するように要求するだけです。

pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);

このコードは、他のスレッドが終了してキュー内のすべてのアイテムを処理するまで 60 秒間待機します。

もっとコードを見せてください。リファクタリングを手伝うことができます。そこまで行きたくない場合は、一部の Java コレクションには、キューが空のときにブロックし、何かが表示されたときにスレッドを起動するメソッドがあります。

于 2012-05-29T21:51:43.670 に答える
0

jstackコマンドを使用して、JVM スレッドのスタック トレースを出力することもできます。

于 2012-05-29T21:52:04.663 に答える