Java线程,完成线程后如何释放资源

时间:2018-07-26 02:05:57

标签: java multithreading

我有一个从Thread扩展的java类,例如,我想将消息发送到队列,但想为每个线程重用Producer。完成Thread之前不要关闭它。

public class Producer extends Thread {
    private final QueueProducer producer;

    public Producer() {
        Properties props = new Properties();
        producer = new QueueProducer(props);
    }

    public void send(String message) {
        producer.send(message);
    }

    // close?
}

对于这段代码,我如何调用close方法?

1 个答案:

答案 0 :(得分:1)

如果QueueProducer没有实现Closeable并且没有提供关闭其资源的方法,那么您将无法显式关闭它。最好的方法是通过限制其在运行方法中的范围,从而可以使用GC。

但是,如果它执行AutoCloseableCloseable,则用try-with-resources块包装QueueProducer以在使用后自动将其关闭。

public void run(){

    try(QueueProducer qp = producer){
        //do operation on qp
    }
}

或使Producer实现Closeable。在其覆盖的close方法中,它将改为关闭QueueProducer。例如:-

class Producer extends Closeable{

   private final QueueProducer qp;

   ....

   @Override
   public void close(){

      if(qp!=null){
         qp.close();
      }
   }
}

这类似于BufferedReader,后者的close方法关闭其内部Reader对象。因此,QueueProducer一直可用直到客户端关闭Producer本身。