Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程在没有警告的情况下退出_Java_Multithreading - Fatal编程技术网

Java线程在没有警告的情况下退出

Java线程在没有警告的情况下退出,java,multithreading,Java,Multithreading,我的java线程退出时出现任何警告。我不知道线程为什么退出。我在jstack里找不到。而且日志代码似乎没有运行。我的代码如下: private class WorkThread extends Thread { public WorkThread() { super("work-thread"); setDaemon(false); } @Override public void run() { logger.i

我的java线程退出时出现任何警告。我不知道线程为什么退出。我在jstack里找不到。而且日志代码似乎没有运行。我的代码如下:

private class WorkThread extends Thread {

    public WorkThread() {
        super("work-thread");
        setDaemon(false);
    }

    @Override
    public void run() {
        logger.info("start running thread work-tracker");
        try {
            while (!interrupted()) {
                try {
                    // do something
                } catch (Throwable e) {
                    logger.error("ignore all exception", e);
                }
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }                    
            }
        } finally {
            logger.error("work thread exit interrupted status: {}", interrupted());
        }
    }
}

我在jstack日志中找不到“工作线程退出中断状态”日志和任何关于“工作线程”的信息。有什么建议吗?

你确定曾经发生过
中断()?你的主线程是真的完成了,还是挂起了/你是被迫终止应用程序的?
e.printStackTrace
使用它。
System.exit()
将结束一切,而不执行
finally
@TimBiegeleisen我在jstack日志中找不到线程名称。而且,如果线程被中断,它应该打印log in finally block?调用
interrupted()
方法清除线程的中断状态。因此,为了更好地检查方法的中断状态,请使用
isInterrupted()
方法。为什么您认为System.out比异常日志记录更好?对不起,我刚刚替换了它,线程在您的代码中永远不会中断OK,现在请解释为什么重新编写OP代码并将调用移动到interrupt()中除了试着抓住OP问题的答案。这些问题表明,线索不知何故被打断了;并不是说OP想从内部中断它。不,我移动了Thread.currentThread().interrupt();脱离挡块,因此螺纹将中断
private class WorkThread extends Thread {

    public WorkThread() {
        super("work-thread");
        setDaemon(false);
    }

    @Override
    public void run() {
        logger.error("start running thread work-tracker");
        try {
            while (!interrupted()) {
                try {
                    // do something
                } catch (Throwable e) {
                    logger.error("ignore all exception");
                }
                try {
                    TimeUnit.SECONDS.sleep(5);
                } catch (InterruptedException e) {

                }
                Thread.currentThread().interrupt();
            }
        } finally {
            logger.error("work thread exit interrupted status: {}" +interrupted());
        }
    }
}