您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java項目中的線程池異步怎么利用 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模式是看不出來的。
看完上述內容,你們對Java項目中的線程池異步怎么利用 ExecutorServic實現有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。