2

我通常用大约 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
}
4

4 回答 4

3

如何找到导致线程停止的原因?

你知道线程已经停止的事实吗?如前所述,它们可能会被阻止。您可以使用jstack它们来查看它们是否处于活动状态,或者更仔细地检查在启用远程调试的情况下启动程序,并在您觉得它们已停止时附加调试器。

于 2012-10-19T22:35:14.520 回答
1

您可以尝试在调试器中运行程序,这可以让您检查线程的状态。

您还可以使用Java中的内置Ctrl-Break或机制 - 请参阅故障排除挂起或循环进程,这将导致 HotSpot VM 打印线程转储,包括线程状态。Ctrl-\

于 2012-10-19T22:30:00.237 回答
1

问题只是尖叫死锁- 它显示了一个人的所有经典症状。

死锁是指线程 A 等待线程 B 完成并释放一些资源(锁),而线程 B 等待线程 A 完成并释放一些资源。
有关死锁的更多信息可以在 java 教程中找到

这导致两个线程都停止执行并且什么都不等待。

在某些情况下,查找程序是否确实存在死锁可能非常棘手,即使在使用旨在检测死锁的程序时,使用该程序也可以暂时“解决问题”。有关更多详细信息,请参阅Heisenbug

有时(尽管并非总是如此)检测死锁的最佳方法是查看程序的抽象,并尝试检查线程之间的所有依赖项 - 并查看可能发生依赖项冲突的位置。

PS 另一个常见的同步问题是数据竞赛

于 2012-10-19T22:35:28.597 回答
0

首先,我会研究 ExecutorService 并将您的代码分解为 Callable。这将允许您在具有返回值或让异常发生的能力的线程中运行它。然后,如果出现问题,您可以重新启动它。

每当代码捕获 Exception 和/或 Throwable 时,就会产生很大的代码异味。应抛出已检查异常之外的任何异常。如果你使用上面提到的可调用模式,你可以检查你得到了什么,记录它,然后重新启动(如果需要)。

于 2012-10-20T05:59:14.577 回答