我有一个从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方法?

最佳答案

如果QueueProducer没有实现Closeable并且没有提供关闭其资源的方法,那么您将无法显式关闭它。最好的方法是限制其在运行方法内的范围,因此有资格使用GC。

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

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本身为止。

10-04 13:39