為什么需要多線程提高服務(wù)器吞吐量悠抹?
web容器可以開的線程是有限珠月,比如tomcat,如圖1楔敌。
為了提高吞吐量,我們可以通過Callable執(zhí)行任務(wù)驻谆,從而放出主線程卵凑,如圖2。
但是大部分的時候業(yè)務(wù)邏輯比較復(fù)雜胜臊,Callable并不能完全滿足我們的需求勺卢,如圖3. 這時候我們就需要DeferredResult幫助我們。
Callable和Deferredresult做的是同樣的事情——釋放容器線程象对,在另一個線程上異步運行長時間的任務(wù)黑忱。
那么,DeferredResult和返回Callable有什么區(qū)別勒魔?
不同的是這一次線程是由我們管理甫煞。創(chuàng)建一個線程并將結(jié)果set到DeferredResult是由我們自己來做的。
用completablefuture創(chuàng)建一個異步任務(wù)冠绢。這將創(chuàng)建一個新的線程抚吠,在那里我們的長時間運行的任務(wù)將被執(zhí)行。也就是在這個線程中弟胀,我們將set結(jié)果到DeferredResult并返回楷力。
剩下的圖是部分代碼和結(jié)果