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

执行器服务在可完成的将来使用时未正确关闭

田易安
2023-03-14

我异步执行三个任务

  CompletableFuture<IStoryDetail> iStoryDetailCompletableFuture = CompletableFuture.supplyAsync(()->storyRepository.getStoryDetails(id));
 CompletableFuture<List<Comment>> iCommentFuture = CompletableFuture.supplyAsync(() -> commentRepository.getComments(id));
 CompletableFuture<List<Images>> iImageFuture = CompletableFuture.supplyAsync(() -> imageRepository.getImagesByStoryId(id)); 

在那之后,我加入了所有这些任务

CompletableFuture.allOf(iCommentFuture, iStoryDetailCompletableFuture, iImageFuture)
          ;

这似乎很好,但当我决定在Executor服务中运行Completable future时

  @Autowired
  ICommentRepository commentRepository;

  ExecutorService executorService = Executors.newFixedThreadPool(4);




CompletableFuture<IStoryDetail> iStoryDetailCompletableFuture = CompletableFuture.supplyAsync(()->storyRepository.getStoryDetails(id),executorService);
     CompletableFuture<List<Comment>> iCommentFuture = CompletableFuture.supplyAsync(() -> commentRepository.getComments(id),executorService);
     CompletableFuture<List<Images>> iImageFuture = CompletableFuture.supplyAsync(() -> imageRepository.getImagesByStoryId(id),executorService);



iStoryDetailCompletableFuture.thenApply(story -> objectMap.putIfAbsent(story.getClass().getName(),story));
  iCommentFuture.thenApply(comments -> objectMap.putIfAbsent(Comment.class.getName(),comments));
  iImageFuture.thenApply(images -> objectMap.putIfAbsent(Images.class.getName(),images));

   CompletableFuture.allOf(iCommentFuture, iStoryDetailCompletableFuture, iImageFuture).thenRun(() -> executorService.shutdown())
      ;

执行器服务似乎无法正确关闭,对控制器的进一步请求被阻止,我在这里错过了什么,感谢您的帮助

删除thenRun(()后-

共有1个答案

漆雕博
2023-03-14

shutdown()等待任何现有托管线程完成。如果您不关心它管理的线程是否已完成,请使用shutdownNow()。

 类似资料:
  • 我试图理解java中完整期货的非阻塞回调性质 有了上面的代码,我总是看到下面看到的输出 线程名称ForkJoinPool.common池工人-1 thenApply Thread name main thenApply Thread name main thenAcceptThread name main Thread name main 这个顺序似乎建议主线程等待所有Futures线程的执行。

  • 我仍在努力理解如何使用ScheduledExecutorService。我想要一个ScheduledExecutorService/ScheduledThreadPoolExecutor,它调度多个任务,并允许它们运行固定的时间。一旦不再调度任务,我就要关闭ScheduledThreadPoolExecutor。我试图通过编写一些测试来理解这是如何工作的。我尝试的第一件事是: 这工作得很好,我得到

  • 我有一个关于CompletableFuture方法的问题: JavaDoc的意思是: 返回一个新的完成阶段,当此阶段正常完成时,将使用此阶段的结果作为所提供函数的参数来执行该阶段。有关异常完成的规则,请参阅完成阶段文档。 穿线呢?这将在哪个线程中执行?如果未来由线程池来完成呢?

  • 我在同一个jvm中运行Netty客户端和服务器并试图停止服务器时遇到问题。以下是我的代码来举例说明: 我已经用Netty 3.4.0测试过了。最终和3.4.4。最后,我不知道我做错了什么。 为什么在服务器关闭后,客户端仍然可以向服务器发送数据?

  • 问题内容: 背景 我正在尝试将条纹付款集成到我的网站中。我需要使用我的专用条纹密钥创建一个条纹用户。我将此密钥存储在服务器上,并调用服务器方法来创建用户。也许还有另一种方法可以做到这一点? 我的尝试和结果 我一直在使用相同的客户端代码和不同的服务器代码。所有尝试都会立即在客户端的console.log(…)上给出undefined,但在服务器的console.log(…)上给出正确的响应: 我也尝

  • 我以前有个可打电话的课 我曾经使用提交。如何更改为使用