0

すべてのスレッドを処理するために、Java API の threadPoolExecutor クラスを使用しています。現時点では、スレッド プールに存在できるスレッドが 5 つあります。私のスレッドはすべて同じタスクを実行しています。彼らはデータベースへの要求を行っており、応答を待っています。データベースがしばらく応答しないことがあります。これは、これらのスレッドが待機中のスレッド プールでスタックすることを意味します。

スレッドプール内のスレッドにタイムアウトを設定する方法はあるのだろうかと思っていました。そのため、スレッドが 30 分以上実行されている場合、スレッド プールはそのスレッドを強制終了し、キュー内の次のスレッドを処理します。私はしません

現在、スレッド プール内のスレッドには、スレッドが 30 分以上かかっていることをログに書き込む独自のタイマー タスクがあります。これだけ時間がかかるスレッドを殺す方法を考えようとしています。

どうやってやるの !

4

2 に答える 2

1

キープアライブタイム

プールに現在corePoolSizeを超えるスレッドがある場合、keepAliveTime(getKeepAliveTime(java.util.concurrent.TimeUnit)を参照)を超えてアイドル状態になっていると、余分なスレッドは終了します。これは、プールがアクティブに使用されていないときにリソース消費を削減する手段を提供します。後でプールがよりアクティブになると、新しいスレッドが構築されます。このパラメーターは、メソッドsetKeepAliveTime(long、java.util.concurrent.TimeUnit)を使用して動的に変更することもできます。Long.MAX_VALUE TimeUnit.NANOSECONDSの値を使用すると、アイドル状態のスレッドがシャットダウンする前に終了するのを効果的に無効にします。デフォルトでは、keep-aliveポリシーは、corePoolSizeThreadsを超える場合にのみ適用されます。ただし、メソッドallowCoreThreadTimeOut(boolean)を使用して、このタイムアウトポリシーをコアスレッドにも適用できます。

ThreadPoolExecutorJavaドキュメントから

于 2012-08-03T05:24:01.647 に答える
0

1.を使用しCachedThreadPoolます。

2. CachedThreadPool はプールされ、定義された数のスレッドで開始されます。必要に応じて、新しいスレッドにまたがることができます。

3.の最も驚くべき、そしてあなたが望む機能CachedThreadPoolスレッドが 60 秒間どのアクティビティにも関与していない場合、スレッドが強制終了されることです。

于 2012-08-03T05:02:32.840 に答える