web-dev-qa-db-ja.com

Java 8のThread.stop()の代替?

Thread.stopが削除されたため、ThreadJava 8で強制的に停止する方法はありますか?これには、lock/synchronized/sleep/wait/infiniteループで待機しているスレッドを強制的に停止することが含まれます。

これはwatchdogの一部として意図されており、アプリケーションがdeadlocked/frozenを持っているかどうかを検出し、強制的にスレッドを強制終了し、現在の状態を保存して情報の損失を回避します。スレッドを強制的に停止することにより、この情報が破損する可能性が高くなります。情報を失うよりも、正しくない可能性のある情報のコピーを用意することをお勧めします。

ロックされたスレッドを停止せずにこの情報を保存することは不可能です。保存するにはロックを取得する必要があるためです。

20
Luna

Threadを本当に停止する必要がある場合は、メソッド Thread.stop() (任意のThrowableを提供せずに)がまだ機能すると考えるのが難しい方法です。 Java 8を使用します。異常な名前にもかかわらず、停止したスレッドで ThreadDeath を生成し、他のErrorと同様に処理できます。唯一の違いは、ThreadDeathがキャッチされない場合、スタックトレースが出力されないことです。


ただし、このメソッドは、他のstopメソッドと同じ理由でほとんど廃止されていることに注意してください。 Javaの次のリリースの1つでは、サポートされなくなる可能性があります。それでは、計画Bについて考える時間です...

6
Holger

これらの記事を読んで、彼らはそれを説明します:

  1. 「Thread.stop、Thread.suspend、Thread.resume、Runtime.runFinalizersOnExitが廃止された理由」 http://docs.Oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

  2. Joshua Bloch: "Effective Java(2nd Edition)"、Item 66:Synchronize access to shared mutable data

ジョシュア・ブロックはスレッドを停止する方法を説明し、これを言います:

あるスレッドを別のスレッドから停止するタスクを検討してください。ライブラリはThread.stopメソッドを提供しますが、このメソッドは本質的に安全ではないため、ずっと前に非推奨になりました。このメソッドを使用すると、データが破損する可能性があります。 Thread.stopは使用しないでください。あるスレッドを別のスレッドから停止するには、最初のスレッドがブール値フィールドをポーリングすることをお勧めします。最初はfalseですが、2番目のスレッドがtrueに設定して、最初のスレッドがそれ自体を停止することを示すことができます。

この手法を使用する場合は、ブールフィールドの同期も処理する必要があります。 Joshua Blochの本からあまり多くのものをコピーしたくありませんが、そこにあるすべてのものと、上記の公式のOracle Javaのドキュメント)にあります。

7
Honza Zidek

スレッドを停止する正しい方法は、そのスレッドでinterruptを呼び出すことです。

1
peter.petrov