2

我有一个类(class A例如)实现Runnable。在运行方法中我有一个try catch。我想像这样开始一个新thread的捕获

new Thread(new A()).start();

这是处理异常的真正方式吗?

我的意思是这可能是一种危险的方式,因为堆很快就会被填满;换句话说garbage collector,不会object因为刚刚在其中创建另一个对象而造成垃圾。

4

4 回答 4

4

我的意思是这可能是一种危险的方式,因为堆很快就会被填满;换句话说,垃圾收集器不会垃圾这个对象,因为刚刚在其中创建了另一个对象。

由于这个原因,它并不危险。如果我们假设这new Thread(new A()).start();是原始线程在退出之前所做的最后一件事,那么当我们需要 GC 时,原始线程将已经退出,因此它的堆栈内容将无法访问。唯一仍然可以访问的线程将是它仍然存在的线程。

但是,如果新线程可能会重复计算,然后一次又一次地抛出相同的异常,这是很危险的……所以如果你写这样的代码,应用程序保持跟踪线程重新启动的频率,如果它发生得太频繁,请拔掉插头。

编写的代码的另一个问题是启动原始线程的代码看到它死了,但没有听到新线程的消息。如果您想通过中断工作线程来启动关闭,那将是有问题的。

如果将这两个问题(和其他问题)放在一起,最好由启动原始线程的代码负责重新启动。

于 2012-09-02T13:42:21.347 回答
3

Thread 是新的并行轻量级进程。一旦其运行方法完成,它将有资格进行 GC。我认为它不会影响对象从它开始的地方的 GC 生命周期。

在您的情况下,只有一件新事物是使用线程处理异常。在不了解有关您为什么要这样做的更多详细信息的情况下,很难说它是安全/良好的做法。

于 2012-09-02T13:17:03.210 回答
2

这不是在线程中处理异常的好方法。为什么新创建的同类型线程不会出现同样的异常?

你应该做的是让某种形式的线程管理器比线程更上一层楼,它将监视、处理并在旧线程失败时在必要时重新创建新线程。

这将允许您添加更多方法来处理错误,并且如果您尝试调试线程,看起来会更整洁。而不是所有这些挂起的线程(因为父级已被 GC 清理),您会知道所有线程都从同一位置产生。

您提出的建议不会使堆变得混乱,因为线程在完成运行后将被 GC 处理。

于 2012-09-02T13:19:00.120 回答
1

如果您没有存储对您创建的线程的任何引用 - 它将在终止时被 GC 清理。在您的情况下,我认为在 run() 方法中启动一个新线程是非常安全的。

请确保您没有创建内部类或存储此线程实例 - 当然,这可能会导致内存泄漏。

祝你好运

于 2012-09-02T13:15:14.773 回答