Java线程,线程完成后如何释放资源
我有一个java类,它从Java线程,线程完成后如何释放资源,java,multithreading,Java,Multithreading,我有一个java类,它从线程扩展而来,例如,我想向队列发送消息,但想为每个线程重用生产者。在线程完成之前不要关闭它 public class Producer extends Thread { private final QueueProducer producer; public Producer() { Properties props = new Properties(); producer = new QueueProducer(prop
线程
扩展而来,例如,我想向队列发送消息,但想为每个线程重用生产者
。在线程
完成之前不要关闭它
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
并且没有提供关闭其资源的方法,则无法显式关闭它。最好的方法是将其作用域限制在run方法内,从而符合GC的条件
但是,如果它确实是AutoCloseable
或Closeable
,则使用try with resources块包装QueueProducer
,以便在使用后自动关闭它
public void run(){
try(QueueProducer qp = producer){
//do operation on qp
}
}
或使生产者
实现可关闭
。在其重写的close中,方法将改为关闭QueueProducer。例如:
class Producer extends Closeable{
private final QueueProducer qp;
....
@Override
public void close(){
if(qp!=null){
qp.close();
}
}
}
这与
BufferedReader
相似,它的close方法会关闭其内部Reader
对象。因此,QueueProducer
在客户端关闭Producer
之前保持可用。您需要在run()结束时释放所有资源
method因为这是线程启动时执行的方法,所以您甚至可以在run
中创建一个try with resources
块来定义生产者的范围。为什么send
是公共的?其他线程是否在此线程实例上调用方法?这可能会带来麻烦。那么为什么run方法没有在这里被重写呢?为什么不在run方法结束时关闭正在使用的东西?@Thilo抱歉,send
不应该公开,这只在run
内部调用。如果我将运行
的范围限制在中,是否可以重用队列生产者
的同一实例?应该显式关闭数据库连接等资源。GC不会关闭它们是的,它们中的大多数是可自动关闭的,或者提供了某种关闭()方法。如果忘记关闭,这将是灾难性的,因为套接字、连接、etc2等资源将被占用。是的,QueueProducer
实现了AutoCloseable
。但问题是我不想每次调用send
后都调用close
方法。我只想创建一个QueueProducer
的实例。如果使用try with resources
我假设每次都调用close
。@ttt,改装Producer
以实现Closeable
。在其重写的close
方法中,改为closeQueueProducer
。这与BufferedReader
相似,其关闭方法关闭其内部读卡器
状态。因此,QueueProducer
在客户端关闭之前保持可用QueueProducer
@AwanBiru,如果它是一个正在运行的web应用程序?我也必须这样做吗?