java线程早期和可疑地终止

时间:2009-04-26 23:34:56

标签: java multithreading

我在Runnable中有以下代码传递给线程t:

public void run() {
        logger.debug("Starting thread " + Thread.currentThread());

        try {
            doStuff();
        } catch (Exception e) {
         logger.debug("Exception in Thread " + Thread.currentThread());
        } 

        logger.debug("End of thread " + Thread.currentThread());
    }

我遇到了一个错误,我发现死锁具有以下条件

  • 我的日志
  • 仅打印了线程消息的开头
  • 线程转储显示线程t(应该执行此操作)不再运行

这个线程是否有一些神奇的方式可以在没有记录线程结束消息或抛出异常的情况下提前终止?

5 个答案:

答案 0 :(得分:7)

您确定doStuff()没有抛出Error吗?将catch (Exception e)更改为catch (Throwable t)

答案 1 :(得分:1)

你确定开始()线程的位置,你之后还加入()吗?

Runnable myRunnable=new Runnable(){
  @Override
  public void run(){
    // your original code goes here
  }
};

Thread myThread=new Thread(myRunnable);

myThread.start();

myThread.join(); // magic happens here! it waits for the thread to finish ;)

顺便说一句, join()可能会抛出 InterruptedException , 所以,如果某个东西在运行时中断了你的线程, 加入会通过抛出此异常通知您。

希望这有帮助。

答案 2 :(得分:1)

当您捕获Exception时,您将捕获任何RunnableException和任何已声明的抛出Exception,但您不会捕获任何扩展Error的内容。如果你真的想要抓住任何的东西,那么你需要抓住Throwable

如果您只想执行此操作以进行日志记录,并且您不关心线程退出的原因,则可以执行此操作:

public void run() {
  logger.debug("Starting thread " + Thread.currentThread());
  try {
    // The work of your Thread
  } finally {
    logger.debug("End of thread " + Thread.currentThread());
  } 
}

并保证执行finally语句,除非线程停止或死锁或以其他方式停止执行而没有异常。

在我的大多数程序中,我安装了一个UncaughtExceptionHandler,以便我知道每个意外死亡的线程。它在跟踪故障方面提供了巨大的帮助。这已添加到Java 5的语言中。

答案 3 :(得分:0)

当然,线程可能会在try/catch块结束后但在最后logger.debug语句之前被中断。在这种情况下,它会抛出一个InterruptedException,原则上可能不会记录在任何地方(如果默认的异常处理程序设置为忽略这些东西)。

这似乎是一个不太可能发生的情况,但是......如果不了解更多关于你程序的其他内容的话,很难说清楚发生了什么。

答案 4 :(得分:0)

当您捕获一般异常时,我建议您记录它,以便您知道异常是什么并且它会导致异常。如果不这样做将无济于事。