を使用しているときにハングスレッドを処理する方法ExecutorService executorService = Executors.newFixedThreadPool(100)
というコードで100個のスレッドを作成したとします。残念ながら、100個のスレッドがすべてハングするとします。その場合、スレッドプール新しい要求を処理することはできません。そのような状況にどう対処するのですか?ハングスレッドを強制的に強制終了し、スレッドプールに戻しますか?それはどのようにスレッドを強制的に中止するのですか?またはタイムアウトがある場合は、タイムアウト後にハングスレッドが自動的に中止され、スレッドプールに戻りますか?Executors.newFixedThreadPool(100)
答えて
スレッドには1つの寿命しかないため、Executor Serviceスレッドは決して死ぬことはありません。タイムアウトはオプションではありません。実行した実装にはタイムアウトが必要です。これは、データベースやhttpサービスのような外部サービスの使用のためにハングしている場合にのみ実行できます。それとは別に、あなたのローカルコードでスレッドロックが起こっていないことを保証する必要があります。プロファイラを使用してこれらの問題を把握します。
はい、データベースでブロッキングの問題が発生しているとします。スレッドがハングして一定期間にわたってハングしないようにするため、そのスレッドを強制終了する必要があります。 – Jason
いいえ。スレッドを強制終了しないでください。データベース接続には、適切なタイムアウトを設定する必要があります。 timeoutのデフォルト値を高くすると、そのスレッドは終了するまでに時間がかかります。 私が上記のような何か他の理由のために、私が上で述べた/示唆したことをしなければならない。最後に、すべてのスレッドが回復不能であった場合にアプリケーションを再起動し、問題を修正します。 –
、はい、データベースではタイムアウトを設定できます。したがって、他の外部データソースのタイムアウトを設定する方法がない場合はどうでしょうか。 – Jason
- 1. Executors.newFixedThreadPool()からのIllegalArgumentException
- 2. プロデューサコンシューマ - Executors.newFixedThreadPoolを使用
- 3. countinue Executors.newFixedThreadPoolの終了後のメソッド
- 4. HTTPServerのExecutors.newFixedThreadPoolに利用可能なプロセッサを設定します。
- 5. Executors.newFixedThreadPoolを使用した非同期Java NIOのヘルプ
- 6. 100%
- 7. Java - Executors.newFixedThreadPoolで実行されたスレッドは決して終了しません。
- 8. 注:予想 'フロート(*)[100]' が、引数は型である 'フロート(*)[100] [100]'
- 9. Chromeフレックスボックス100%高さ内100%高さフレックスボックスオーバーフロー
- 10. モバイルブラウザと100%x 100%固定要素
- 11. Header-bg div 100%is not really 100%
- 12. 正規表現100から100
- 13. SSRS 100%
- 14. document.body.style.height = "100%";
- 15. 100メガバイト
- 16. アンドロイドContextWrapper.Java:100
- 17. DIVストレッチ100%
- 18. Charles Proxy 100%スロットル
- 19. Twitter Bootstrap - 100%Height
- 20. コンテンツ100%伸び
- 21. Googleレビュー100%幅
- 22. calc()100%+ #px
- 23. @media with width:100%
- 24. Selenium Grid 100 Instances
- 25. 100文字ラインマーカー
- 26. クロームデベロッパーツールが100%CPU
- 27. Jquery slideshow 100%width
- 28. ElasticSearch 100%CPU
- 29. vs_buildtoolsインストーラ100%CPU
- 30. 100%幅のボタングループ?
これはXYの問題ですか?スレッドがぶら下がっている理由を知っていますか? – bradimus
@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
あなたはスレッドプールをシャットダウンできます:-) – Scorpion