2

ディレクトリのファイル変更を監視する Runnable クラスを作成しました。

... imports ...

public class ExamplePathWatch implments Runnable {
    ...
    private boolean isRunning = true;
    ...

    @Override
    public void run() {
        while(isRunning) {
            [1]... wait for a file change ...
            [2]... notify listeners of file change (if any) ...
        }
    }

    public synchronized void stopPathWatch() {
        isRunning = false;
        ... interrupt [1] and allow the thred to exit immediately...
    }

スレッドは、ファイルの変更が発生するか、 [1] で現在の待機を設定および中断するメソッドが呼び出されるまで、[ 1 ]一時停止します。stopPathWatch()isRunning = false

メイン アプリケーションが終了する直前にstopPathWatch()が呼び出され、スレッドが終了し、アプリケーション全体が完全に終了します。

私の問題は、アプリケーションがクラッシュすると、メインアプリケーションstopPathWatch()が呼び出されずに終了することです。したがって、アプリケーションは、OS によって強制終了されるまで、バックグラウンドで無期限に実行され続けます。

アプリケーションの開発は非常に活発であり、すべての例外が処理されるわけではないため、メイン アプリケーションがどのように終了しても子スレッドを確実に停止するための推奨される方法はありますか?

ありがとう

4

2 に答える 2

8

ExamplePathWatchをデーモンスレッドとして実行できます。デーモンとしてマークされていないスレッドのみが、アプリケーションの終了を防ぎます。

于 2013-03-06T13:42:21.387 に答える
1

これをシャットダウン フックとして追加できます。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        stopPathWatch();
    }
});

このコードは、プログラムのどこかに配置する必要があります。

于 2013-03-06T13:44:29.560 に答える