Java ExecutorServic線程池異步實(shí)現(xiàn)流程
相信大家都在項(xiàng)目中遇到過這樣的情況,前臺(tái)需要快速的顯示,后臺(tái)還需要做一個(gè)很大的邏輯。比如:前臺(tái)點(diǎn)擊數(shù)據(jù)導(dǎo)入按鈕,按鈕后的服務(wù)端執(zhí)行邏輯A,和邏輯B(執(zhí)行大量的表數(shù)據(jù)之間的copy功能),而這時(shí)前臺(tái)不能一直等著,要返回給前臺(tái),告訴正在處理中就行了。這里就需要用到異步了。
點(diǎn)擊按鈕 -> 邏輯A ->邏輯B(異步) -> 方法結(jié)束。
到底,項(xiàng)目需求明確了,就引入了ExecutorServic線程池。
Java通過Executors提供四種線程池,分別為:
- newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
- newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
- newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
- newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author szy * @version 創(chuàng)建時(shí)間:2018-5-20 上午10:25:06 * */ public class Testasync { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub if(task0() == true){ System.out.println("執(zhí)行完畢,看異步結(jié)果"); } } public static void task1(){ System.out.println("task1 is start"); } public static void task2(){ ExecutorService executor = Executors.newFixedThreadPool(1); executor.submit(new Callable(){ @Override public Object call() throws Exception { // TODO Auto-generated method stub //增加睡眠時(shí)間,便于查看結(jié)果 /* try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }*/ //異步提交 int sum = 0; for (int i = 0; i < 10000; i++) { sum += i; } System.out.println("task2執(zhí)行數(shù)據(jù)的大量導(dǎo)入或者導(dǎo)出"); System.out.println("task2="+sum); System.out.println("task2導(dǎo)入或者導(dǎo)出完成"); return null; } }); } public static void task3(){ System.out.println("task3 is start"); int j = 0; while(true) { if(j++ > 10) { break; } System.out.println("------------task3 end-----------"); } } public static boolean task0(){ task1(); task2(); task3(); return true; } }
然后看結(jié)果:
task1 is start task3 is start ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- ------------task3 end----------- task2執(zhí)行數(shù)據(jù)的大量導(dǎo)入或者導(dǎo)出 執(zhí)行完畢,看異步結(jié)果 task2=49995000 task2導(dǎo)入或者導(dǎo)出完成
可以看出,task1 和task3先執(zhí)行了,并且方法在沒有等待task2的情況下,直接結(jié)束了。
異步的task2另開了一個(gè)線程,自己在執(zhí)行。和主線程已經(jīng)無關(guān)了。
不過,這種在eclipse中以deubug模式是看不出來的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
大家都用過鬧鐘,鬧鐘可以說是一種定時(shí)任務(wù)。那么,在?Java?中,如何實(shí)現(xiàn)這樣的功能呢?即如何實(shí)現(xiàn)定時(shí)任務(wù)呢?本文就來詳細(xì)和大家聊聊2022-10-10SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式
這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringCloud Webflux過濾器增加header傳遞方式
這篇文章主要介紹了SpringCloud Webflux過濾器增加header傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Springboot?hibernate-validator?6.x快速校驗(yàn)示例代碼
這篇文章主要介紹了Springboot?hibernate-validator?6.x校驗(yàn),本文以6.2.1.Final版本為例解決了log4j版本的漏洞問題,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12解決@JsonInclude(JsonInclude.Include.NON_NULL)不起作用問題
這篇文章主要介紹了解決@JsonInclude(JsonInclude.Include.NON_NULL)不起作用問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Spring Cloud分布式定時(shí)器之ShedLock的實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud分布式定時(shí)器之ShedLock的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Mybatis游標(biāo)查詢大量數(shù)據(jù)方式
這篇文章主要介紹了Mybatis游標(biāo)查詢大量數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java父線程(或是主線程)等待所有子線程退出的實(shí)例
下面小編就為大家分享一篇Java父線程(或是主線程)等待所有子線程退出的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11java全角與半角標(biāo)點(diǎn)符號(hào)相互轉(zhuǎn)換詳解
這篇文章主要為大家介紹了java全角與半角標(biāo)點(diǎn)符號(hào)相互轉(zhuǎn)換詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03