当前位置: 首页 > 知识库问答 >
问题:

需要关于java中ExecutorService的建议吗

薄高懿
2023-03-14

嘿,所以我为ExecutorService的java文档选择了这个例子。我想确认这个代码的流程,执行者。newFixedThreadPool将创建一个线程池(我猜)。所以serversocket将等待连接,一旦获得连接,就会启动一个线程,所以现在池大小减少1。一旦线程完成执行,池大小将再次增加1,不是吗?线程会放弃它使用的资源吗?

class NetworkService implements Runnable {
 private final ServerSocket serverSocket;
 private final ExecutorService pool;

 public NetworkService(int port, int poolSize)
   throws IOException {
 serverSocket = new ServerSocket(port);
 pool = Executors.newFixedThreadPool(poolSize);
}

 public void run() { // run the service
 try {
   for (;;) {
     pool.execute(new Handler(serverSocket.accept()));
   }
 } catch (IOException ex) {
   pool.shutdown();
  }
 }
}

class Handler implements Runnable {
 private final Socket socket;
 Handler(Socket socket) { this.socket = socket; }
 public void run() {
  // read and service request on socket
 }
}

共有3个答案

杜焕
2023-03-14

由于它是一个固定的ThreadPool,是的,每次将任务提交到池时池大小都会减小

龙弘盛
2023-03-14

线程所做的只是执行您的Runnables。
因此,如果您需要在任务完成后进行任何清理,您应该从您的Runnable中进行。池只是一个Producer-消费者模式实现,负责管理线程的生命周期。
线程执行您在队列中传递的任务,因此在您的情况下,套接字不会在线程之间重用。它的范围在Runnable

凌华奥
2023-03-14

一旦线程完成执行,池大小将再次增加1,不是吗?

对线程将执行并运行下一个处理程序

线程会放弃它使用的资源吗?

不是立即,不是。一旦处理程序run()方法完成,那么处理程序将超出范围。但是,在释放处理程序实例之前,必须等待垃圾收集器运行。这将依次释放Socket,然后它将成为垃圾收集本身的候选对象。

如果希望更快地释放套接字(我认为这就是问题所在),那么应该在run()方法的末尾完成。你可以调用socket。close()(并可能将套接字设置为)在最后块中。建议采用以下方式:

class Handler implements Runnable {
    ...
    public void run() {
       try {
           // read and service request on socket
       } finally {
           // make sure we close the socket when the handler is finishing
           socket.close();
       }
    }
}

 类似资料:
  • 关于如何使用Java处理自签名证书的问题已经被问过很多次,并且经常提供实现。但是,我不确定这些实现是否会给我带来我正在寻找的安全性/信任。 我的情况如下:我有一个连接到服务器应用程序的客户端程序。这两者我们都可以完全控制。我们的客户使用https将流发布到我们服务器上的URL,服务器响应。目前(这就是我试图修复的)服务器有一个自签名证书。Java不喜欢这样,并且仅用于测试,我们通过信任任何证书几乎

  • 我正在上这门Android编程课,我现在要做一个项目。我的应用程序应该能够添加一些效果,如混响/回声/合唱/等。到音轨上。 我尝试使用PresetReverb和EnvironmentalReverb,但没有成功(应用程序运行,但没有应用任何效果)。 我也检查了这个解决方案,但不适合我。我在Genymotion虚拟设备Galaxy Nexus-4.3-API18和三星Galaxy Chat B533

  • 我已经在我的应用程序中使用创建了线程池,以调用供应商Web服务,使用下面的代码。 我想知道我们是否需要关闭线程池之类的,基本上我不希望在正式生产环境中挂起线程。

  • 我有一个场景,其中我得到一个String消息列表,我必须遍历String并调用另一个方法,这是一个长时间运行的过程。然后我必须收集这个长时间运行过程的结果并连接结果并将其发送回用户交互界面。我对Scala中的这些未来概念很陌生。我正在使用Play框架,其中字符串列表将来自用户交互界面。这是我第一次尝试实现ht场景的样子: 为简单起见,long RunningCall将只返回一个字符串。稍后我将把它

  • 我试图运行一个Spring boot Kafka流示例https://cloud.spring.io/spring-cloud-stream-binder-kafka/spring-cloud-stream-binder-kafka.html#_usage_2地点 我能够成功地构建它。但在运行时,出现如下所示的错误(java.lang.IllegalStateException:org.sprin

  • 我正在使用Java 8构建一个使用SpringBoot和SpringREST服务的API。我刚刚发现了Swagger API,现在我想让我的API与Swagger兼容。 据我所知,Swagger是一个记录您的APIS的工具,而且还提供了从规范(swagger.jsonv2中)生成客户端和服务器代码的功能,以及与您的API交互的漂亮Web界面。 现在,我想要一些关于如何继续的建议,因为我已经有了一个