2016-08-30 2 views
0

を使用しているときにハングスレッドを処理する方法ExecutorService executorService = Executors.newFixedThreadPool(100)というコードで100個のスレッドを作成したとします。残念ながら、100個のスレッドがすべてハングするとします。その場合、スレッドプール新しい要求を処理することはできません。そのような状況にどう対処するのですか?ハングスレッドを強制的に強制終了し、スレッドプールに戻しますか?それはどのようにスレッドを強制的に中止するのですか?またはタイムアウトがある場合は、タイムアウト後にハングスレッドが自動的に中止され、スレッドプールに戻りますか?Executors.newFixedThreadPool(100)

+3

これはXYの問題ですか?スレッドがぶら下がっている理由を知っていますか? – bradimus

+0

@bradimusに同意すると、解決策はハングするコードを書き込まないことです。 Javaのほとんどのブロック操作には、メソッドのタイムアウト・バージョンがあります(例:https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#connect(java.net.SocketAddress) vs https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int))。スレッドプールやメインスレッドで作業が行われているかどうかにかかわらず、通常はメソッドのタイムアウト可能なバージョンを使用する必要があります。 – Taylor

+0

あなたはスレッドプールをシャットダウンできます:-) – Scorpion

答えて

0

スレッドには1つの寿命しかないため、Executor Serviceスレッドは決して死ぬことはありません。タイムアウトはオプションではありません。実行した実装にはタイムアウトが必要です。これは、データベースやhttpサービスのような外部サービスの使用のためにハングしている場合にのみ実行できます。それとは別に、あなたのローカルコードでスレッドロックが起こっていないことを保証する必要があります。プロファイラを使用してこれらの問題を把握します。

+0

はい、データベースでブロッキングの問題が発生しているとします。スレッドがハングして一定期間にわたってハングしないようにするため、そのスレッドを強制終了する必要があります。 – Jason

+0

いいえ。スレッドを強制終了しないでください。データベース接続には、適切なタイムアウトを設定する必要があります。 timeoutのデフォルト値を高くすると、そのスレッドは終了するまでに時間がかかります。 私が上記のような何か他の理由のために、私が上で述べた/示唆したことをしなければならない。最後に、すべてのスレッドが回復不能であった場合にアプリケーションを再起動し、問題を修正します。 –

+0

、はい、データベースではタイムアウトを設定できます。したがって、他の外部データソースのタイムアウトを設定する方法がない場合はどうでしょうか。 – Jason

関連する問題