我有一个从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。
但是,如果使用AutoCloseable
或Closeable
,则将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
本身为止。