我有一个类(例如class A
)实现Runnable
。在run方法中,我有一个try catch
。我想在这样的catch中开始一个新的thread
new Thread(new A()).start();
这是处理异常的真实方式吗?
我的意思是这可能是一种危险的方式,因为堆很快就会满了;换句话说,garbage collector
不会对此object
进行垃圾处理,因为其中只创建了另一个对象。
答案 0 :(得分:4)
我的意思是这可能是一种危险的方式,因为堆很快就会满了;换句话说,垃圾收集器不会垃圾这个对象,因为刚刚在其中创建了另一个对象。
因为这个原因并不危险。如果我们假设new Thread(new A()).start();
是原始线程退出之前的最后一件事,那么当我们需要GC时,原始线程将退出,因此其堆栈内容将无法访问。唯一仍然可以访问的线程将是它仍然存在的线程。
然而,如果新线程可能会重复计算然后再次抛出相同的异常,并且又一次又一次......这样做是危险的。所以如果你这样编写代码,那么它是个好主意。用于跟踪线程重新启动频率的应用程序,如果频繁发生则拔掉插件。
编写代码的另一个问题是启动原始线程的代码看到它死了,但没有听到新线程。如果您想通过中断工作线程来启动关闭,那么这是有问题的。
如果将这两个问题(和其他问题)放在一起,那么启动原始线程的代码最好负责重新启动。
答案 1 :(得分:3)
螺纹是新的平行轻量化工艺。一旦其运行方法完成,它将有资格用于GC。我认为它不会影响对象的GC生命周期。
在您的情况下,只有一个新事物是使用线程处理异常。如果不了解您想要这个的原因的详细信息,很难说它是安全/良好的做法。
答案 2 :(得分:2)
这不是处理线程内异常的好方法。为什么新创建的相同类型的线程没有相同的异常?
你应该做的是从线程中获得某种形式的线程管理器,该线程将监视,处理,并在必要时重新创建新线程。
这将允许您添加更多方法来处理错误,如果您尝试调试线程,它将看起来更整洁。而不是拥有所有这些悬挂的线程(因为父进程被GC清理),你将知道所有线程都是从同一位置生成的。
你提出的建议不会使堆混乱,因为线程在运行完毕后会被GC化。
答案 3 :(得分:1)
如果您没有存储对您创建的线程的任何引用 - 终止时它将由GC清除。在你的情况下,我认为在run()方法中启动一个新线程是相当安全的。
请确保您没有创建内部类或存储此线程实例 - 当然,它可能会导致内存泄漏。
祝你好运