Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程,线程完成后如何释放资源_Java_Multithreading - Fatal编程技术网

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

我有一个java类,它从
线程
扩展而来,例如,我想向队列发送消息,但想为每个线程重用
生产者
。在
线程
完成之前不要关闭它

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
方法中,改为close
QueueProducer
。这与
BufferedReader
相似,其关闭方法关闭其内部
读卡器
状态。因此,
QueueProducer
在客户端关闭之前保持可用
QueueProducer
@AwanBiru,如果它是一个正在运行的web应用程序?我也必须这样做吗?