使用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。几乎看起来这些方法没有区别?
答案 0 :(得分:1)
对于第一部分,我建议你看一下第8章。应用线程池&#34; Java Concurrency in Practice&#34;书。
对于第二部分 - 是的,spring使用提供的线程池自行执行Callable任务,而DeferredResult应由应用程序处理。它提供了更多控制,例如,应用程序可以在运行时决定是否应该基于某些元数据在单独的线程中运行特定计算。 DeferredResult还支持回调。