私はJavaアプリケーションを構築し、ボタンが押されたときにバックグラウンドで何かを実行するスレッドを持っています。問題は、おそらく無限ループが原因で、スレッドがロックする可能性があることです。そのスレッドを強制終了する方法はありますか?
編集:私はJavaプラットフォームでLuaJを使用しています。ロックアップする可能性があり、別のスレッドで実行してJavaまたはスクリプトのいずれかが終了したときに強制終了する以外は、実際にはあまり制御できません。
私はJavaアプリケーションを構築し、ボタンが押されたときにバックグラウンドで何かを実行するスレッドを持っています。問題は、おそらく無限ループが原因で、スレッドがロックする可能性があることです。そのスレッドを強制終了する方法はありますか?
編集:私はJavaプラットフォームでLuaJを使用しています。ロックアップする可能性があり、別のスレッドで実行してJavaまたはスクリプトのいずれかが終了したときに強制終了する以外は、実際にはあまり制御できません。
いいえ、ありません。主要な魔術がない場合の唯一の選択は、interrupt()を呼び出して、ブロッキング呼び出しがヒットするのを待つことです。その時点で、スレッドを終了する必要があるInterruptedExceptionがスローされます。
while(1);
あなたが本当に多くをすることができないようなループにあるならば; これを行わないように、または少なくともフラグをチェックしてそれ自体を停止するように、スレッドを修正する必要があります。
たとえば、次のように書き直すことができます。
while(1) {
doWork();
}
なので:
class Whatever {
private volatile boolean stop = false;
...
while (!stop) {
doALittleWork();
}
...
}
以前はこれを行うThread.stop()
方法がありましたが、非常に非常に正当な理由で非推奨になっているため、使用しないでください。
編集:
おそらくインタプリタを実行しているので、すべてのステートメントが実行された後(またはそう)フックして魔法のstop
変数をチェックし、そうであればLuaの実行を終了する必要があります。あるいは、Luaランタイムには、使用できる独自の「終了」フラグがある場合があります。ドキュメントを探しましたが、サイトがひどいため、このためのコードを確認する必要があります。
それ以外に、この機能を追加するには、Lua4jソースに手動でパッチを適用する必要がある場合があります。あなたの選択肢はかなり限られており、最終的にはスレッドはそれ自身の運命をどうにかして制御しなければなりません。
最後に、 java.util.concurrentを組み込んだJava V5.0(またはV1.5)のリリースにより、決定的な答えを出すことができます。答えは、interrupt()を使用してスレッドを停止することです。