-1

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

thread = new Thread(this);

如果检查不正确,我会打电话给stop().In stop 我有这个电话:

thread.join();

但是,如果我从未创建过新线程,这将如何工作。我会得到一个NullPointerException. 我应该如何处理这个问题?抓住NullPointerException?仅thread.join()在线程不为空​​时调用?不打电话thread.join()?什么是最好的方法,为什么?谢谢 :-)

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

4

2 回答 2

2

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

于 2012-05-25T14:33:55.257 回答
2

这似乎有点像 Java 101 的答案,所以我不确定我是否理解这个问题。

在您init()的方法中,您可能会或可能不会启动新线程并设置thread字段。在您的stop()方法中,该thread字段可能为空或不为空。如果您只想在join()该线程不为空​​的情况下使用该线程,那么您将使用以下代码:

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

NullPointerException应避免捕捉。创建异常实际上是一个相当昂贵的过程——尤其是在它们拍摄堆栈帧的快照时。这是一个很好的讨论,它引用了“Effective Java”一书的话说,异常比非慢约 70 倍。

Exceptions 有多昂贵

许多人使用异常将状态信息返回给调用者,但这是 IMO 的错误模式。异常适用于“异常”条件,不能替代错误代码和返回的对象。

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

于 2012-05-25T14:19:30.710 回答