3つのスレッドを使用するJavaで書かれたプログラムがあります。IDE(Netbeans)ではすべてが正常に機能しており、IDEを強制終了すると、すべてのスレッドが破壊されます。コマンドラインから起動してCtrl-Cを押すと、スレッドは実行され続けます。これに対処するための最良の方法は何ですか?
その後フラグを使用できると思うので、メインスレッドを強制終了しますか?
3つのスレッドを使用するJavaで書かれたプログラムがあります。IDE(Netbeans)ではすべてが正常に機能しており、IDEを強制終了すると、すべてのスレッドが破壊されます。コマンドラインから起動してCtrl-Cを押すと、スレッドは実行され続けます。これに対処するための最良の方法は何ですか?
その後フラグを使用できると思うので、メインスレッドを強制終了しますか?
メインスレッドにシャットダウンフックを登録して、他のスレッドを適切にクリーンアップできます。
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("System shutting down");
// tell your other threads to shut down from here
// the best way to do this is to set a flag
// that they will pick up on and exit gracefully
}
});
}
1.some loop control mechanism
ブール値を使用してスレッドを作成できます。
2.Daemon threads
それ以外の場合は、を使用してみてください。デーモン以外のスレッドがないため、JVMは閉じられます。
その非デーモンをdefalutすることにより、実行スレッドでメソッドを呼び出す前に、スレッドをデーモンとして設定 できます...start()
The JVM will terminate ONLY when all the non-daemon threads including the Main thread has
terminated.
例えば:
Thread t = new Thread(MyClass);
t.setDaemon(true);
私が知っているほとんどのLinuxシステムでは、プログラムがフォアグラウンドにある場合にcontrol-cを押すと、JVMに割り込み信号(SIGINT)が送信され、すべてのスレッド(デーモンかどうか)が強制終了されて終了します。私はこのばかげた小さなプログラムをMacOSXとCentOSLinuxで試しましたが、control-cで正常に終了します。
ここで言及されていないことの1つは、シグナルハンドラーが割り込みシグナルをトラップしている可能性があることです。それらを使用すると、control-c(およびその他の信号)をキャッチできるため、それらを使用してインテリジェントな操作を実行できます。これらは(もちろん)OSに非常に依存しており、割り込み信号をキャッチし(SIGINTは通常control-cによって送信されます)、JVMを停止しないと、問題が発生します。
ただし、いずれの場合も、次のようなことができます。
...
MyHandler handler = new MyHandler();
// catch the control-c signal, "TERM" is another common kill signal
Signal.handle(new Signal("INT"), handler);
...
private static class MyHandler implements SignalHandler {
@Override
public void handle(Signal arg0) {
// interrupt your threads
// clean up stuff
// set shutdown flags
// ...
}
}
繰り返しになりますが、JVMを停止せずに割り込み信号(control-c)をキャッチすることは悪い習慣だと思います。これは、アプリケーションに問題がある可能性があります。
1つのスレッドをマスタースレッドとして、他のスレッドをデーモンスレッドとして使用します。
Thread.setDaemon(true)を使用する
その後フラグを使用できると思うので、メインスレッドを強制終了しますか?
Ctrl-Cが特に何をするのかはわかりませんが、「永続的な」スレッドをデーモンスレッドにすると、デーモン以外のすべてのスレッドが終了したときにアプリが終了するはずです。詳細については、Thread
ドキュメントを参照してください。
Java実行可能ファイルは、stdoutへのスレッドダンプを生成することにより、Windowsではctrl-c(unixではctrl- \)に応答するように作成されます。あなたはまだWindowsのctrl-breakによってそれを殺すことができます。