Java线程在没有警告的情况下退出
我的java线程退出时出现任何警告。我不知道线程为什么退出。我在jstack里找不到。而且日志代码似乎没有运行。我的代码如下: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
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());
}
}
}