2012-09-02 32 views
2

我有一个类(class A为例)实现Runnable。在run方法我有一个try catch。我想捕捉到启动新的thread这样开始一个新的线程捕获

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

这是一个真实的方式来处理异常?

我的意思是也许它是一种危险的方式,因为堆很快就会变满;换句话说garbage collector不会垃圾这object,因为另一个对象已经在其中创建。

回答

4

我的意思是,也许它是一种危险的方式,因为堆很快就会变满;换句话说,垃圾收集器不会垃圾该对象,因为另一个对象已经在其中创建。

这是没有危险因为这个原因。如果我们假设new Thread(new A()).start();是原始线程退出前的最后一件事,那么当我们需要GC时,原始线程将退出,因此其堆栈内容将无法访问。仍然可以访问的唯一线程将是它仍然活着的线程。

然而,这是危险的,如果新线程容易重复计算,然后再抛出同样的异常,并再次,再次......所以,如果你写这样的代码,它是一个好主意应用程序可以跟踪线程重新启动的频率,如果发生的频率过高,可以拔下插件。

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

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

1

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

只要确保你没有创建内部类或存放该线程实例 - 它可以引起,当然内存泄漏。

祝你好运

3

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

你的情况只有一件新事情是用线程处理异常。不知道为什么要这样做的更多细节,很难说它是安全的/好的做法。

2

这不是一个处理线程内异常的好方法。为什么新创建的同一类型的线程不会有相同的异常?

你应该做的是有某种形式的线程管理器了从线程,将监测,处理,并在必要时重新创建新线程时,旧的失败的水平。

这将允许你添加更多的方式来处理错误,并会好看很多整洁,如果你尝试和调试线程。而不是所有这些挂起的线程(导致父母被GC清理),你会知道所有线程都从同一个位置产生。

你提议不会杂乱堆,因为当他们已经完成正在运行的线程将被GC'd什么。

+0

Thanx Serdalis这似乎是一个合乎逻辑的方式来处理them.but但我有一个问题:你说“父母被清理”,那么如何才能保持一个新类的实例已被创建? –

+1

如果家长被垃圾收集器清理干净,则无法确定您正在查看的线程在何处或什么时候生成。如果遇到新的错误,这将很难进行调试。 – Serdalis

+0

所以我从你的理解是,这种方式对堆不危险,不会导致内存泄漏,但很难调试。正确? –

相关问题