2012-02-02 10 views
2

AIプログラミング競技では、AIJVMで実行され、当社ではAPIを提供しています。 SecurityManagerで何ができるのかを制限してサンドボックスに入れ、実行時にはそれらの決定であるいくつかのフラグを設定するだけです。私たちのシステムと彼らのAIとの間の唯一のやりとりは、これらのフラグを介しているため、スレッドが突然死亡した場合に悪影響はありません。中断しないスレッドを殺すには?

AIの計算時間が長すぎる場合は、スレッドをシャットダウンします。しかし、スレッドを破棄する方法を見つけることはできません。考えられる理由の1つは、AIがブロックなしで無限ループに入り、Thread.interrupt()が役に立たなくなることです。 Thread.stop()は信頼できません。なぜなら、try catchブロック内にある場合、ThreadDeath例外がキャッチされ、何も悪いことに触れず、死ぬかどうか気にしないため、私たちにとって問題はありません。

現在のところ、スレッドは無視され、タイムアウト後もスレッドなしで続行されますが、無限ループは、JVMが終了するまでバックグラウンドで処理を続けます。これは私たちには受け入れられません。なぜなら、Webサーバーのバックグラウンドで24時間365日の試合が行われるため、できるだけ多くの安定性が欲しいからです。 1つの考えは、別々のJVMで各ゲームを実行することでしたが、それは私たちが得たいと思っているよりはるかに複雑です。

スレッドを破壊する確実な方法はありますか?

+0

あなたが制御できるスレッドにコードをロードしてください – L7ColWinters

+2

なぜ 'Thread.stop()'がオプションではないのかをより明確に説明してください。 – Tudor

+0

APIに応じて、コードを別のプロセスで実行し、応答しなくなった場合には単純に終了させることができます。 –

答えて

0

いくつかのことを試した結果、保証された解決策はないという結論に達しました。スレッド上でstop()を呼び出すことで、そのスレッドはThreadDeathスローダブをキャッチし、それを完全に無視することができます。したがって、whileループで継続的にキャッチしている場合、またはキャッチしたメソッドを再帰的に呼び出す場合は、それを強制終了することはできません。

この場合実行されるコードを制御できず、そのコードが必ずしもJavaであるとは限らないため(私たちはJythonもサポートしていました)、私たちが思いつく最良の解決策は、スレッドを継続的に呼び出すループに入ったスレッド(スレッド)を停止()します。結果はほとんどの場合有効でしたが、時には悪意のあるスレッドを殺すことができませんでした。

+0

この場合、アプリケーションの安全でない部分をJVMプロセスを分離して監視することを検討する必要があります。これは一番安全な方法のようです。 –

0

計算中であっても定期的に呼び出さなければならないメソッドをそれらに提供しなければなりません。彼らが「死んでいる」と判断すれば、方法は永遠に眠ります。明らかに、彼が本当に死んだ場合、彼は働かないでしょうが、あなたはほとんどの問題を捉えるべきです。彼らが知っていることはできない、とあなたは正規表現で自分のコードをチェックできることをThrowableのカスタムサブクラスで

0

一般的に、いいえ、JVM内の任意のスレッドを停止しないでください(したがって、メソッドは非推奨です)。問題の根源は、スレッドを殺すときにスレッドがどこにあるのかわからないということです。最悪の場合、JVMのインフラストラクチャ内の同期ブロックの途中にあり、予期しない例外がスローされることはありません。 (その任意の点で例外で死滅させることができる強力な同期コードを書くことはほぼ不可能。)

は、より多くの詳細については、この質問に高格付けの回答を参照してください: Are java app servers able to destroy threads? If yes, how?

は、あなたが得ることができるかもしれませんAIスレッドを終了するように協調設計しています。もしそうであれば、あなたはよかったです。そうでない場合は、JVMを再起動する必要があります。

関連する問題