2

JConsole を使用してアプリを一定期間監視すると、「ライブ スレッド」の数が常に増加していることがわかります。スレッド数を増やすことは私には悪いことのように聞こえますが、それは間違っていますか?

概要: このアプリでは、Executors.newFixedThreadPool、Executors.newSingleThreadScheduledExecutor を使用して、さまざまなコレクターのスレッド プールを作成します。これらのコレクターは数分ごとに呼び出されます。そして、コレクションごとに上記のコレクターによってn回呼び出されるこの他のサービスがあります。このサービスは、FutureTask を実行する単一のスレッド (Executors.newFixedThreadPool(1);) を生成します。上記のすべての ExecutorServices について、例外がキャッチされた場合にのみ shutdownNow() を呼び出し、残りは GC に任せます。

1) プロセスが終了したらエグゼキューターをシャットダウンする必要がありますか? それとも GC に頼ることができますか?

あなたの提案と洞察に感謝します

4

2 に答える 2

1

スレッド プールのポイントは、処理中に新しいスレッドを生成するオーバーヘッドを回避することです。新しいスレッドプールを生成することは想定されていません。(あなたがここでやっていることですExecutors.newFixedThreadPool(1);

アプリケーションの起動時にスレッド プールを設定し、それらを処理オブジェクトに挿入する必要があります。

于 2012-07-06T17:30:52.613 に答える
1

executor サービスで shutdown を明示的に呼び出す必要があります - executor.shutdown() を使用して、リソースの整然としたシャットダウンと再生を行います (古いタスクは実行されますが、新しいタスクは受け入れられません)。

shutdownNow() は、アクティブに実行中のすべてのタスクを停止しようとし、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します (実行中のタスクについて保証はありません - 実行される場合と実行されない場合があります - これが最善の方法です)。試み)。

于 2012-07-06T17:06:55.767 に答える