如何确保守护程序线程始终在Java中运行?

时间:2015-12-16 16:02:22

标签: java multithreading

在Web应用程序中,我的代码创建了一些守护程序线程作为内部类,以检查传入请求中的一些信息。

    private static class AlertThread extends Thread {

    private AlertThread() {
        setDaemon(true);
    }

    public void run() {
        while (true) {
            try {
               ...
            }
            catch (InterruptedException e1) {
                LogFactory.getLog(AlertThread.class)
                        .warn("InterruptedException when waiting");
                e1.printStackTrace();
            }
            catch (Exception e) {
                mainLogger.error("Error processing Alert " + e.getMessage());
            }
        }
    }
}

代码运行良好,并且线程运行正常,但我想确保此线程将始终运行,如果它被杀死(由于任何未知原因),我应该如何重新启动新实例?

2 个答案:

答案 0 :(得分:3)

最好的解决方案是不要让它一开始就死掉。你可以这样做

<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
            </button>
        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li><a href="index.php" class="activepage">Home</a></li>
                <li><a href="why.php">Why Us?</a></li>
                <li><a href="process.php">Process</a></li>
                <li><a href="news.php">News</a></li>
                <li><a href="#contact">Contact</a></li>
            </ul>
        </div>
    </div>
</nav>

除非您关闭应用程序,否则此线程不会死亡。

BTW你应该在启动它之前使该线程成为一个守护进程,你应该避免扩展Thread,因为这样做会导致细微的错误。

答案 1 :(得分:1)

在编写代码时,while循环可以由不是Trowable的任何Exception终止。它可以是Error,例如StackOverflowError