Java ExecutorServic線程池異步實現(xiàn)流程
相信大家都在項目中遇到過這樣的情況,前臺需要快速的顯示,后臺還需要做一個很大的邏輯。比如:前臺點擊數(shù)據(jù)導入按鈕,按鈕后的服務端執(zhí)行邏輯A,和邏輯B(執(zhí)行大量的表數(shù)據(jù)之間的copy功能),而這時前臺不能一直等著,要返回給前臺,告訴正在處理中就行了。這里就需要用到異步了。
點擊按鈕 -> 邏輯A ->邏輯B(異步) -> 方法結(jié)束。
到底,項目需求明確了,就引入了ExecutorServic線程池。
Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。 newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。 newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行。 newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author szy * @version 創(chuàng)建時間: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//增加睡眠時間,便于查看結(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ù)的大量導入或者導出');System.out.println('task2='+sum);System.out.println('task2導入或者導出完成');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 starttask3 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ù)的大量導入或者導出執(zhí)行完畢,看異步結(jié)果task2=49995000task2導入或者導出完成
可以看出,task1 和task3先執(zhí)行了,并且方法在沒有等待task2的情況下,直接結(jié)束了。
異步的task2另開了一個線程,自己在執(zhí)行。和主線程已經(jīng)無關了。
不過,這種在eclipse中以deubug模式是看不出來的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關文章:
1. 使用Python webdriver圖書館搶座自動預約的正確方法2. Python字符串到字節(jié)的轉(zhuǎn)換。雙反斜杠問題3. Python sublime安裝及配置過程詳解4. Linux刪除系統(tǒng)自帶版本Python過程詳解5. Python 合并拼接字符串的方法6. Python3 json模塊之編碼解碼方法講解7. python 使用事件對象asyncio.Event來同步協(xié)程的操作8. ASP.NET MVC使用jQuery ui的progressbar實現(xiàn)進度條9. Java Long類型對比分析10. ASP基礎知識VBScript基本元素講解

網(wǎng)公網(wǎng)安備