如何使用异步线程调整/分析线程池配置?

Posted

技术标签:

【中文标题】如何使用异步线程调整/分析线程池配置?【英文标题】:How to tune / analyze thread pool configuration with asynchronous threads? 【发布时间】:2017-09-15 20:35:07 【问题描述】:

使用 Servlet 3.0,我们可以创建异步操作的任务,允许将处理请求的线程返回到容器,该容器现在可以使用它来处理另一个请求。如果我们使用线程池来配置可用于异步请求的线程数,应该如何调整/我们应该考虑哪些参数?

也可以告诉 spring 从 ForkJoin 池中抓取一个线程并进行如下处理:(Taken from this tutorial:

    logger.info("Request received");
    DeferredResult<String> deferredResult = new DeferredResult<>();
    CompletableFuture.supplyAsync(taskService::execute)
        .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
    logger.info("Servlet thread released");

我们什么时候应该这样做,而不是使用Callable 采用托管线程池方法?几乎看起来唯一的区别是,在一种情况下,我们可能想要配置 Java 8s commonPool,而 Spring Boot 会从那里抓取线程来执行上述类型的 CompleteableFuture 处理,而在另一种情况下,我们似乎会配置某种类型的Spring 的 ExecutorService。似乎这两种方法几乎没有区别?

【问题讨论】:

【参考方案1】:

对于第一部分,我建议您看一下“Java 并发实践”一书的第 8 章。应用线程池。

对于第二部分 - 是的,spring 使用提供的线程池自行执行 Callable 任务,而 DeferredResult 应该由应用程序处理。它提供了更多的控制,例如应用程序可以在运行时根据一些元数据决定是否应该在单独的线程中运行特定的计算。 DeferredResult 也支持回调。

【讨论】:

以上是关于如何使用异步线程调整/分析线程池配置?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务

Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务

Task.Run使用默认线程池

Android AsyncTask内部线程池异步执行任务机制简要分析

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

SpringBoot自定义异步任务线程池