如果发生异常,Java Threads是否需要清理

时间:2013-05-03 12:16:56

标签: java multithreading garbage-collection

如果在线程运行期间发生异常,

  1. 我需要清理还是其他什么?
  2. 如果我有数百个线程在运行,我可以使用垃圾收集器来清理我的内存吗?

  3. 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
            }
        }
     }
    

3 个答案:

答案 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())不能保证垃圾收集的发生。