我有一个从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方法?
答案 0 :(得分:1)
如果QueueProducer
没有实现Closeable
并且没有提供关闭其资源的方法,那么您将无法显式关闭它。最好的方法是通过限制其在运行方法中的范围,从而可以使用GC。
但是,如果它执行AutoCloseable
或Closeable
,则用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
本身。