摘要:本篇來看下線程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。時間單位這個線程池中線程處理任務(wù)的的任務(wù)隊(duì)列。上面的例子中我們向線程池中提交了一個,并接受一個返回值。
本篇來看下java線程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。
0x01 線程的實(shí)現(xiàn)一開始我們想要實(shí)現(xiàn)多線程最通常的做法是:
new Thread(new Runnable() { public void run() { System.out.println("raw thread"); } }).start();
這種方式,這種實(shí)現(xiàn)方式也沒有什么不好,只是如果線程一多的話不好對所有的線程進(jìn)行統(tǒng)一管理。然后java有了線程池技術(shù),我們可以通過線程池技術(shù)來替換實(shí)現(xiàn)上面的方式。
0x02 線程池ExecutorService executorPool = Executors.newCachedThreadPool(); Futurefuture = executorPool.submit(new Callable () { public String call() throws Exception { return "future finish"; } }); try { System.out.println(future.get()); } catch (Exception e) { e.printStackTrace(); }
Executors有如下幾種方式創(chuàng)建線程:
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
上面三種方式最終都是調(diào)用ThreadPoolExecutor的構(gòu)造函數(shù)進(jìn)行線程池的創(chuàng)建,只是傳入的參數(shù)不一樣,而實(shí)現(xiàn)不同的線程池對象。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize:創(chuàng)建線程池時創(chuàng)建多少個線程。
maximumPoolSize:這個線程池中對多能有多少個線程。
keepAliveTime:當(dāng)線程數(shù)量超過corePoolSize時,多余的空閑線程最大的存活時間。也就是說多余的線程在keepAliveTime時間還是沒有處理任何的任務(wù)將會被終止。
unit:時間單位
workQueue:這個線程池中線程處理任務(wù)的的任務(wù)隊(duì)列。
threadFactory:創(chuàng)建新線程的線程工廠。
handler:當(dāng)線程數(shù)量達(dá)到maximumPoolSize,對新加入的任務(wù)的處理策略。一般很少使用這個參數(shù)基本都采用默認(rèn)的handler。
上面的例子中我們向線程池中提交了一個Callable,并接受一個返回值Future。Callable可能會是一個非常耗時的操作但是使用方有不想阻塞等待其返回再繼續(xù)執(zhí)行,這時Callable執(zhí)行完后會將結(jié)果放到Future中,使用方可以在需要的時候去判斷是否Callable已經(jīng)執(zhí)行完成,如果完成就可以通過Future拿到其返回值。
0x03 ScheduledExecutorService任務(wù)定時調(diào)度線程的使用:
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(); scheduledExecutorService.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("schedule task with fixed rate:" + System.currentTimeMillis()); } }, 2000, 1000, TimeUnit.MILLISECONDS); scheduledExecutorService.scheduleWithFixedDelay(new Runnable() { public void run() { System.out.println("schedule task with fixed delay:" + System.currentTimeMillis()); int count = Integer.MAX_VALUE; while (count-- > 0){ } System.out.println("time:" + System.currentTimeMillis()); } }, 2000, 1000, TimeUnit.MILLISECONDS);
ScheduledExecutorService有兩種定時調(diào)度的方式:
scheduleAtFixedRate:以固定速率進(jìn)行調(diào)度,意思是任何兩個被調(diào)度的任務(wù)之間的時間間隔是固定的。第二個任務(wù)的調(diào)度時間(開始執(zhí)行時間)= 第一個任務(wù)的調(diào)度時間 + 間隔時間
scheduleWithFixedDelay:第二個任務(wù)的調(diào)度時間 = 第一個任務(wù)的調(diào)度時間 + 第一個任務(wù)的執(zhí)行時間 + 間隔時間
0x04 Timer定時任務(wù)上面介紹了ScheduledExecutorService來做定時任務(wù),在編程的過程中還可以使用Timer來做定時任務(wù),代碼如下:
timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { doSomething(); } catch (Exception e) { System.out.println("timer excute exception", e); } } }, 1000 * 3, 1000);
其第一參數(shù)是一個TimerTask,第二第三個參數(shù)scheduledExecutorService.scheduleAtFixedRate這個調(diào)用的第二三個參數(shù)一致。
0x05 參考我覺得最好的參考還是閱讀相關(guān)源碼去理解Executor的使用方式,這樣自己才能理解的比較深入同時做到活學(xué)活用。
線程池的的核心實(shí)現(xiàn)ThreadPoolExecutor,想了解更多還是自己去look look源碼吧。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/66217.html
摘要:當(dāng)活動線程核心線程非核心線程達(dá)到這個數(shù)值后,后續(xù)任務(wù)將會根據(jù)來進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時默默丟棄不能執(zhí)行的新加任務(wù),不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:四種線程池的使用介紹的弊端及四種線程池的使用,線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。相比,提供的四種線程池的好處在于重用存在的線程,減少對象創(chuàng)建消亡的開銷,性能佳。延遲執(zhí)行描述創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。 java 四種線程池的使用 介紹new Thread的弊端及Java四種線程池的使用 1,線程池的作用 線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。 ...
摘要:高并發(fā)系列第篇文章。簡單的說,在使用了線程池之后,創(chuàng)建線程變成了從線程池中獲取一個空閑的線程,然后使用,關(guān)閉線程變成了將線程歸還到線程池。如果調(diào)用了線程池的方法,線程池會提前把核心線程都創(chuàng)造好,并啟動線程池允許創(chuàng)建的最大線程數(shù)。 java高并發(fā)系列第18篇文章。 本文主要內(nèi)容 什么是線程池 線程池實(shí)現(xiàn)原理 線程池中常見的各種隊(duì)列 自定義線程創(chuàng)建的工廠 常見的飽和策略 自定義飽和策略 ...
摘要:中的線程池運(yùn)用場景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。代碼中如果執(zhí)行了方法,線程池會提前創(chuàng)建并啟動所有核心線程。線程池最大數(shù)量線程池允許創(chuàng)建的線程最大數(shù)量。被稱為是可重用固定線程數(shù)的線程池。 Java中的線程池運(yùn)用場景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。那么線程池有什么好處呢,以及他的實(shí)現(xiàn)原理是怎么樣的呢? 使用線程池的好處 在開發(fā)過程中,合理的使用線程...
閱讀 1397·2021-11-24 09:38
閱讀 3324·2021-11-22 12:03
閱讀 4348·2021-11-11 10:59
閱讀 2422·2021-09-28 09:36
閱讀 1101·2021-09-09 09:32
閱讀 3553·2021-08-05 10:00
閱讀 2616·2021-07-23 15:30
閱讀 3050·2019-08-30 13:12