Java线程停止工作,不会抛出Exception或Throwable

时间:2012-10-19 22:25:49

标签: java multithreading

我通常用大约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 个答案:

答案 0 :(得分:3)

  

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

你知道线程已停止的事实吗?如上所述,他们可能会受阻。您可以使用jstack来查看它们是否处于活动状态,或者进行更仔细的检查以启用远程调试启动程序,并在您认为已停止时附加调试器。

答案 1 :(得分:1)

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

您还可以使用Java中的内置Ctrl-BreakCtrl-\机制 - 请参阅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时,这是一个很大的代码味道。应抛出除已检查异常之外的任何异常。如果您使用上面提到的可调用模式,您可以检查您获得的内容,记录并重新启动(如有必要)。