我通常用大约4个线程运行我的程序,在程序运行后1小时到10小时之间的任何地方运行一些线程只是停止并且什么都不做,我的程序围绕Exception和Throwable块而且我也有一个uncaughtException用于线程并没有任何内容添加到我的日志文件中有关任何错误。如何找到导致线程停止的原因?
修改
这是我的代码的基本结构
以下是设置uncaughtException块的代码
newThread.setName("Thread" + totalNumberOfThreads);
newThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
Main.logger.info("ERROR! An exception occurred in " + t.getName() + ". Cause: " + e.getMessage());
}
});
newThread.start();
这是线程的基本结构
@Override
public void run()
{
while (true)
{
try
{
//a long section of code
}
catch (Exception e)
{
e.printStackTrace();
Main.logger.info(threadName + ": " + e);
}
catch (Throwable t)
{
Main.logger.info(threadName + ": " + "Throwable: " + t);
}
finally
{
//some code to close connections.. ect..
}
} // end while
}
答案 0 :(得分:3)
如何找到导致线程停止的原因?
你知道线程已停止的事实吗?如上所述,他们可能会受阻。您可以使用jstack
来查看它们是否处于活动状态,或者进行更仔细的检查以启用远程调试启动程序,并在您认为已停止时附加调试器。
答案 1 :(得分:1)
您可以尝试在调试器中运行程序,这样可以检查线程的状态。
您还可以使用Java中的内置Ctrl-Break
或Ctrl-\
机制 - 请参阅Troubleshooting Hanging or Looping Processes,这将导致HotSpot VM打印线程转储,包括线程状态。< / p>
答案 2 :(得分:1)
问题只是尖叫 DeadLock - 它显示了所有经典症状。
死锁是指线程A等待线程B完成并释放一些资源(锁定),而线程B正在等待线程A完成并释放一些资源。
More information on deadlocks can be found in the java tutorial
这导致两个线程都停止执行并等待无效。
在某些情况下,查找程序是否确实存在死锁可能非常棘手,即使使用旨在检测死锁的程序,程序的使用也可以“暂时解决问题”。有关详细信息,请参阅Heisenbug。
有时(尽管不总是)检测死锁的最佳方法是查看程序的抽象,并尝试检查线程之间的所有依赖关系 - 并查看可能发生在dependecies中可能发生的冲突的位置。
P.S。另一个常见的同步问题是Data Race
答案 3 :(得分:0)
首先,我会查看ExecutorService并将您的代码分解为Callable。这将允许您在一个线程中运行它,能够返回一个值或让异常上升。然后,如果出现问题,您可以重新启动它。
当代码捕获异常和/或Throwable时,这是一个很大的代码味道。应抛出除已检查异常之外的任何异常。如果您使用上面提到的可调用模式,您可以检查您获得的内容,记录并重新启动(如有必要)。