Java ExecutorServic執行緒池非同步實現流程
阿新 • • 發佈:2020-12-01
相信大家都在專案中遇到過這樣的情況,前臺需要快速的顯示,後臺還需要做一個很大的邏輯。比如:前臺點選資料匯入按鈕,按鈕後的服務端執行邏輯A,和邏輯B(執行大量的表資料之間的copy功能),而這時前臺不能一直等著,要返回給前臺,告訴正在處理中就行了。這裡就需要用到非同步了。
點選按鈕 -> 邏輯A ->邏輯B(非同步) -> 方法結束。
到底,專案需求明確了,就引入了ExecutorServic執行緒池。
Java通過Executors提供四種執行緒池,分別為:
- newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
- newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
- newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
- newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先順序)執行。
import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author szy * @version 建立時間: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("執行完畢,看非同步結果"); } } 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 //增加睡眠時間,便於檢視結果 /* 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執行資料的大量匯入或者匯出"); 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; } }
然後看結果:
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執行資料的大量匯入或者匯出 執行完畢,看非同步結果 task2=49995000 task2匯入或者匯出完成
可以看出,task1 和task3先執行了,並且方法在沒有等待task2的情況下,直接結束了。
非同步的task2另開了一個執行緒,自己在執行。和主執行緒已經無關了。
不過,這種在eclipse中以deubug模式是看不出來的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。