确保在主应用程序崩溃时停止无限循环的线程

时间:2013-03-06 13:39:09

标签: java multithreading

我创建了一个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] 处暂停,直到发生文件更改,或调用stopPathWatch()方法设置isRunning = false并中断当前等待 [1]

在主应用程序退出之前,调用stopPathWatch(),允许线程退出,整个应用程序完全终止。

我的问题是,当应用程序崩溃时,主应用程序终止,而不调用stopPathWatch()。因此,应用程序会在后台无限期地运行,直到通过操作系统终止它为止。

由于应用程序上存在非常活跃的开发并且并未处理所有异常,因此无论主应用程序如何终止,是否有建议的方法来确保子线程被停止?

由于

2 个答案:

答案 0 :(得分:8)

您可以将ExamplePathWatch作为守护程序线程运行。只有未标记为守护程序的线程才会阻止应用程序退出。

答案 1 :(得分:1)

您可以将其添加为关闭钩子:

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

此代码必须在程序中的某个位置。