如果在线程运行期间发生异常,
class MyThread extends Thread {
public void run() {
try {
MyDAO dao = new MyDAO();
List<Results> res = dao.findResults(...);
....
} catch(Exception e) {
//Do I need any clean up here
}
}
}
答案 0 :(得分:5)
当run
方法完成时,无论是正常的还是由于异常,它创建的所有对象都可以自由使用,不需要进行特定的清理。
您只需要清理需要关闭的资源(数据库连接,文件流等)。此清理通常在finally
之后的catch
子句中完成。
public void run(){
Statement statement;
try{
MyDAO dao = new MyDAO(); // doesn't need closing
List<Results> res = dao.findResults(...);
statement = getStatement(); // must be closed
....
} catch (Exception e){
// handle the error
} finally {
if (statement!=null) statement.close();
}
}
答案 1 :(得分:4)
你不需要特别清理,除非你有开放系统资源喜欢的文件。一旦线程终止,无论是正常还是异常,它们都会被OS或VM(线程堆栈,......)清理。
普通Java GC回收Thread
个对象本身。通常,当您的内存不足时,GC将执行收集。但是,这不是确定性的。
一般来说,提高内存效率,您可以考虑将线程重构为任务和线程池,每个线程削减大约1兆字节(粗略数字!):
ExecutorService
的实现在线程上运行任务。如果你主要是在做CPU工作而不是I / O,那么拥有与内核一样多的线程而不是数百个线程通常是明智的。有现有的实现,但您也可以实现自己的执行器服务。Callable<T>
是一项任务实施。也许与使用Runnable
个对象的情况非常相似。Future<T>
承担任务结果的承诺。答案 2 :(得分:2)
当对象没有更多引用时,它们会自动被收集垃圾,因此只要没有从其他对象中引用任何线程,那么你应该没问题。
重要的是要注意Java的垃圾收集(使用System.gc()
)不能保证垃圾收集的发生。