3

実稼働環境では、特定のコードが無限ループに陥るという特定の状況があります。原因は主にデータ固有であり、真の原因を特定することはできません。それまでの間、私が望んでいるのは、そのコードを実行するために別の子スレッドを生成することです。たとえば、30秒以上実行される場合は、その子スレッドの実行を停止します。

Thread t = new Thread() {
    public void run() {
                    // This is where i will the method that runs in a infinite loop
                    callMethodThatRunsInInfiniteLoop();
    };
};

t.start();
try {
    t.join(2000); // wait 2s
} catch (InterruptedException e) {
    e.printStackTrace();
} 

// if not completed how to break the child thread ???
4

4 に答える 4

1

残念ながら、それはサードパーティのコードであり、そう簡単に変更することはできません.

サードパーティのライブラリの問題を回避しようとしているようです...またはサードパーティのライブラリを呼び出すコードで、入力が間違っているか何かです。

私のアドバイスは、誤ったスレッドを強制終了しようとするのではなく、その問題を修正することです。それができない場合は、次の 2 つの選択肢があります。

  • サードパーティのライブラリを割り込み対応/応答型に変更し、それを使用して停止するか、または

  • サードパーティのライブラリのデータ構造に「到達」する方法を見つけて (たとえば、厄介なリフレクションを使用して)、それを停止させます。

後者に頼っている場合は、プロセス API を使用して強制的に強制終了できるように、別の JVM でサードパーティ ライブラリを実行することも検討する必要があります。


そうは言っても、Thread.stop()実際に (おそらく) 安全に使用できる状況は限られています。基本的に、誤ったスレッドが子スレッドを作成せず、他のスレッドと対話せず、データ構造を共有せず、スレッドを強制終了したときにクラスの初期化を実行できない場合、おそらく安全です。問題は、スレッドを停止すると損傷が発生する可能性がある理論的なシナリオが非常に多く、それらすべてを考慮したかどうかを知るのが難しいことです。

于 2012-08-09T00:40:54.490 に答える
0

スレッドを「純粋に外部から」停止するすべての方法は推奨されておらず、安全ではないと見なされています。スレッドを安全に停止できる唯一の方法は、

  1. stopMe実行中のコードを変更して、設定されている変数を介して丁寧に停止するように求められているかどうかを確認します。また
  2. 他のスレッドが既に使用している変数を使用して、スレッドを終了させる (これは一般的に非常に悪い習慣です)。たとえば、user949300 によって提案されているように、強制的に例外をスローすることによって。

これがないと、安全でない方法を使用せざるを得なくなります。つまりThread.stop()、これも非常に悪い習慣です。これは非常に悪い考えであり、もちろん唯一の本当の解決策は、これが起こらないように入力を変更するか、サードパーティのコードを修正することです。

スレッドが使用していたオブジェクトは、一貫性のない (そしておそらく使用できない) 状態にある可能性があるため、スレッドに重要なものを変更させないようにしてください。

Thread.stop()もちろん非推奨ですが、このメソッドはJava SE 7にもまだ存在しているようですが、特定の環境を保証することはできません。

http://docs.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.htmlを参照してください。

于 2012-08-08T23:46:20.893 に答える
0

メソッドの実装によっては、独自の JVM で開始してからdestroy()、プロセスを呼び出して停止することができます。

Process process = new ProcessBuilder("java", "-cp", "/some/class/path", "com.mycompany.MyLauncher").start();

// sometime later
process.destroy();
于 2012-08-09T00:27:52.500 に答える