如果init()从未成功,如何在stop()中处理thread.join

时间:2012-05-25 14:09:03

标签: java multithreading nullpointerexception daemon runnable

我有一个问题。我编写了一个Java程序,我从守护程序开始。所以我有一个实现Daemon和Runnable的类。在init()我做了一些检查,然后,当检查没问题时,我开始一个新的线程。

thread = new Thread(this);

如果支票不合适,我拨打stop()。在停止时我接听电话:

thread.join();

但是,如果我从未创建过新的Thread,那么它将如何运作呢?我会得到NullPointerException。我该如何处理这个问题?抓住NullPointerException?如果线程不为空​​,只调用thread.join()?不要打电话给thread.join()?什么是最好的方式和原因?谢谢: - )

我问这个问题的原因只是我以前从未实现过守护进程而且我不确定如何处理那里的线程。也许我不应该问。不管怎样,谢谢。

2 个答案:

答案 0 :(得分:2)

这看起来有点像Java 101的答案,所以我不确定我理解这个问题。

init()方法中,您可能会也可能不会启动新主题并设置thread字段。在stop()方法中,thread字段可能为空或不为空。如果你想join()只有那个线程不是null,那么你可以使用代码:

   if (thread != null) {
      thread.join();
   }

应该避免捕获NullPointerException。创建异常实际上是一个相当昂贵的过程 - 特别是在他们拍摄堆栈帧的快照的情况下。这是一个很好的讨论,引用“有效Java”一书说,异常比非慢约70倍。

  

How expensive are Exceptions

许多人使用异常将状态信息返回给调用者,但这是一种错误的模式IMO。例外情况属于“特殊”条件,并且替代错误代码和返回的对象。

如果我不理解这个问题,请编辑你的帖子,我会调整我的答案。

答案 1 :(得分:2)

如果扩展apache的接口守护进程,那么如果init()方法失败,则必须抛出DeamonInitException。在线程上执行此操作将永远不会被调用,并且守护程序将中止其执行。