1

3つのスレッドを使用するJavaで書かれたプログラムがあります。IDE(Netbeans)ではすべてが正常に機能しており、IDEを強制終了すると、すべてのスレッドが破壊されます。コマンドラインから起動してCtrl-Cを押すと、スレッドは実行され続けます。これに対処するための最良の方法は何ですか?

その後フラグを使用できると思うので、メインスレッドを強制終了しますか?

4

6 に答える 6

2

メインスレッドにシャットダウンフックを登録して、他のスレッドを適切にクリーンアップできます。

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
    }
  });
}
于 2012-07-30T12:03:13.147 に答える
1

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);
于 2012-07-30T12:01:51.900 に答える
1

私が知っているほとんどの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)をキャッチすることは悪い習慣だと思います。これは、アプリケーションに問題がある可能性があります。

于 2012-08-01T14:42:28.243 に答える
0

1つのスレッドをマスタースレッドとして、他のスレッドをデーモンスレッドとして使用します。

Thread.setDaemon(true)を使用する

于 2012-07-30T12:02:31.650 に答える
0

その後フラグを使用できると思うので、メインスレッドを強制終了しますか?

Ctrl-Cが特に何をするのかはわかりませんが、「永続的な」スレッドをデーモンスレッドにすると、デーモン以外のすべてのスレッドが終了したときにアプリが終了するはずです。詳細については、Threadドキュメントを参照してください。

于 2012-07-30T11:57:13.347 に答える
0

Java実行可能ファイルは、stdoutへのスレッドダンプを生成することにより、Windowsではctrl-c(unixではctrl- \)に応答するように作成されます。あなたはまだWindowsのctrl-breakによってそれを殺すことができます。

于 2012-07-30T12:24:00.443 に答える