为什么需要多线程提高服务器吞吐量?
web容器可以开的线程是有限,比如tomcat,如图1。
为了提高吞吐量,我们可以通过Callable执行任务,从而放出主线程,如图2。
但是大部分的时候业务逻辑比较复杂,Callable并不能完全满足我们的需求,如图3. 这时候我们就需要DeferredResult帮助我们。
Callable和Deferredresult做的是同样的事情——释放容器线程,在另一个线程上异步运行长时间的任务。
那么,DeferredResult和返回Callable有什么区别?
不同的是这一次线程是由我们管理。创建一个线程并将结果set到DeferredResult是由我们自己来做的。
用completablefuture创建一个异步任务。这将创建一个新的线程,在那里我们的长时间运行的任务将被执行。也就是在这个线程中,我们将set结果到DeferredResult并返回。
剩下的图是部分代码和结果