2

.NET では、Environment.HasShutdownStartedプロパティをチェックして、何らかの理由でサービスがアンロードされているかどうかを確認し、正常なアンロード/クリーンアップを実行できます。

したがって、代わりに:

while (true) { }

...使用できます...

while (!Environment.HasShutdownStarted) { }

Javaに同等のものはありますか?

4

3 に答える 3

1

おそらく、シャットダウンフックを探していますか? これにより、アプリケーションが閉じられたときに実行されるスレッドを指定できます (ただし、強制的に閉じられない限りkill -9)

Runtime.getRuntime().addShutdownHook(new Thread() {

    public void run() {
        //Code here.
    }
});

実用的な観点からは、これらのスレッドを迅速に実行する必要もあります。そうしないと、アプリケーションが終了時にハングしているように見え、誰もそれを好まないためです (さらに、OS またはユーザーがアプリケーションを強制終了し、フックを中止することを選択する可能性があります)。任意のポイントで。)

複数のシャットダウン フックを追加でき、それらは同時に (任意の順序で) 実行されます。

シャットダウン フックの削除は、 を呼び出すことで同様の方法でダウンできますremoveShutdownHook()

于 2012-12-11T11:22:52.870 に答える
1

shutdown hookを追加できます。基本的に、アプリケーションの終了時に実行される開始されていないスレッドを登録します。

Runtime.getRuntime().addShutdownHook(new Thread() {
   public void run() { 
      // logic for making a clean shutdown...
   }
})

上記のリンクには、シャットダウン中に何が起こるかについての非常に良い説明があります。

于 2012-12-11T11:23:18.390 に答える
1

シャットダウンフック API を見ることができます。

while(true) {
}

スレッド/実行可能な実装でメンバーを宣言して、シャットダウンを示すことができます。

class MyRunnable implements Runnable {
    private running= false;

    public void setRunning(boolean running) {
        running= running;
    }

    public void run() {
        setRunning(true);
        while(running) {
            // do task
        }
    }
}

public static void main(String[] args) {
    final MyRunnable myRunnable= new MyRunnable();
    final Thread runThread= new Thread(myRunnable);
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
            myRunnable.setRunning(false);
        }
    });

    runThread.start();
    runThread.join();
}

これは完全な解決策ではありませんが、少なくとも正しい方向に進むはずです。

于 2012-12-11T11:26:44.183 に答える