摘要:本篇來(lái)看下線(xiàn)程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。時(shí)間單位這個(gè)線(xiàn)程池中線(xiàn)程處理任務(wù)的的任務(wù)隊(duì)列。上面的例子中我們向線(xiàn)程池中提交了一個(gè),并接受一個(gè)返回值。
本篇來(lái)看下java線(xiàn)程池相關(guān)技術(shù)的實(shí)現(xiàn)和使用方式。
0x01 線(xiàn)程的實(shí)現(xiàn)一開(kāi)始我們想要實(shí)現(xiàn)多線(xiàn)程最通常的做法是:
new Thread(new Runnable() { public void run() { System.out.println("raw thread"); } }).start();
這種方式,這種實(shí)現(xiàn)方式也沒(méi)有什么不好,只是如果線(xiàn)程一多的話(huà)不好對(duì)所有的線(xiàn)程進(jìn)行統(tǒng)一管理。然后java有了線(xiàn)程池技術(shù),我們可以通過(guò)線(xiàn)程池技術(shù)來(lái)替換實(shí)現(xiàn)上面的方式。
0x02 線(xiàn)程池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)建線(xiàn)程:
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
上面三種方式最終都是調(diào)用ThreadPoolExecutor的構(gòu)造函數(shù)進(jìn)行線(xiàn)程池的創(chuàng)建,只是傳入的參數(shù)不一樣,而實(shí)現(xiàn)不同的線(xiàn)程池對(duì)象。
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize:創(chuàng)建線(xiàn)程池時(shí)創(chuàng)建多少個(gè)線(xiàn)程。
maximumPoolSize:這個(gè)線(xiàn)程池中對(duì)多能有多少個(gè)線(xiàn)程。
keepAliveTime:當(dāng)線(xiàn)程數(shù)量超過(guò)corePoolSize時(shí),多余的空閑線(xiàn)程最大的存活時(shí)間。也就是說(shuō)多余的線(xiàn)程在keepAliveTime時(shí)間還是沒(méi)有處理任何的任務(wù)將會(huì)被終止。
unit:時(shí)間單位
workQueue:這個(gè)線(xiàn)程池中線(xiàn)程處理任務(wù)的的任務(wù)隊(duì)列。
threadFactory:創(chuàng)建新線(xiàn)程的線(xiàn)程工廠。
handler:當(dāng)線(xiàn)程數(shù)量達(dá)到maximumPoolSize,對(duì)新加入的任務(wù)的處理策略。一般很少使用這個(gè)參數(shù)基本都采用默認(rèn)的handler。
上面的例子中我們向線(xiàn)程池中提交了一個(gè)Callable,并接受一個(gè)返回值Future。Callable可能會(huì)是一個(gè)非常耗時(shí)的操作但是使用方有不想阻塞等待其返回再繼續(xù)執(zhí)行,這時(shí)Callable執(zhí)行完后會(huì)將結(jié)果放到Future中,使用方可以在需要的時(shí)候去判斷是否Callable已經(jīng)執(zhí)行完成,如果完成就可以通過(guò)Future拿到其返回值。
0x03 ScheduledExecutorService任務(wù)定時(shí)調(diào)度線(xiàn)程的使用:
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有兩種定時(shí)調(diào)度的方式:
scheduleAtFixedRate:以固定速率進(jìn)行調(diào)度,意思是任何兩個(gè)被調(diào)度的任務(wù)之間的時(shí)間間隔是固定的。第二個(gè)任務(wù)的調(diào)度時(shí)間(開(kāi)始執(zhí)行時(shí)間)= 第一個(gè)任務(wù)的調(diào)度時(shí)間 + 間隔時(shí)間
scheduleWithFixedDelay:第二個(gè)任務(wù)的調(diào)度時(shí)間 = 第一個(gè)任務(wù)的調(diào)度時(shí)間 + 第一個(gè)任務(wù)的執(zhí)行時(shí)間 + 間隔時(shí)間
0x04 Timer定時(shí)任務(wù)上面介紹了ScheduledExecutorService來(lái)做定時(shí)任務(wù),在編程的過(guò)程中還可以使用Timer來(lái)做定時(shí)任務(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ù)是一個(gè)TimerTask,第二第三個(gè)參數(shù)scheduledExecutorService.scheduleAtFixedRate這個(gè)調(diào)用的第二三個(gè)參數(shù)一致。
0x05 參考我覺(jué)得最好的參考還是閱讀相關(guān)源碼去理解Executor的使用方式,這樣自己才能理解的比較深入同時(shí)做到活學(xué)活用。
線(xiàn)程池的的核心實(shí)現(xiàn)ThreadPoolExecutor,想了解更多還是自己去look look源碼吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66217.html
摘要:中的線(xiàn)程池是運(yùn)用場(chǎng)景最多的并發(fā)框架。才是真正的線(xiàn)程池。存放任務(wù)的隊(duì)列存放需要被線(xiàn)程池執(zhí)行的線(xiàn)程隊(duì)列。所以線(xiàn)程池的所有任務(wù)完成后,它最終會(huì)收縮到的大小。飽和策略一般情況下,線(xiàn)程池采用的是,表示無(wú)法處理新任務(wù)時(shí)拋出異常。 Java線(xiàn)程池 1. 簡(jiǎn)介 系統(tǒng)啟動(dòng)一個(gè)新線(xiàn)程的成本是比較高的,因?yàn)樗婕芭c操作系統(tǒng)的交互,這個(gè)時(shí)候使用線(xiàn)程池可以提升性能,尤其是需要?jiǎng)?chuàng)建大量聲明周期很短暫的線(xiàn)程時(shí)。Ja...
摘要:當(dāng)活動(dòng)線(xiàn)程核心線(xiàn)程非核心線(xiàn)程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線(xiàn)程池工作原則當(dāng)線(xiàn)程池中線(xiàn)程數(shù)量小于則創(chuàng)建線(xiàn)程,并處理請(qǐng)求。當(dāng)線(xiàn)程池中的數(shù)量等于最大線(xiàn)程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線(xiàn)程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:四種線(xiàn)程池的使用介紹的弊端及四種線(xiàn)程池的使用,線(xiàn)程池的作用線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。相比,提供的四種線(xiàn)程池的好處在于重用存在的線(xiàn)程,減少對(duì)象創(chuàng)建消亡的開(kāi)銷(xiāo),性能佳。延遲執(zhí)行描述創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。 java 四種線(xiàn)程池的使用 介紹new Thread的弊端及Java四種線(xiàn)程池的使用 1,線(xiàn)程池的作用 線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。 ...
系統(tǒng)啟動(dòng)一個(gè)線(xiàn)程的成本是比較高,使用線(xiàn)程池可以很好地提高性能,尤其是當(dāng)程序中需要?jiǎng)?chuàng)建大量生存期很短暫的線(xiàn)程時(shí) 線(xiàn)程池在系統(tǒng)啟動(dòng)時(shí)即創(chuàng)建大量空閑線(xiàn)程,將一個(gè)Runnable、Callable對(duì)象—–>傳給線(xiàn)程池—–>線(xiàn)程池啟動(dòng)里面的一個(gè)線(xiàn)程來(lái)執(zhí)行它們的run()或者call()方法———->當(dāng)線(xiàn)程執(zhí)行體執(zhí)行完成后,線(xiàn)程并不會(huì)死亡,而是再次返回線(xiàn)程池成為空閑狀態(tài),等待下一個(gè)Runnable、Calla...
摘要:高并發(fā)系列第篇文章。簡(jiǎn)單的說(shuō),在使用了線(xiàn)程池之后,創(chuàng)建線(xiàn)程變成了從線(xiàn)程池中獲取一個(gè)空閑的線(xiàn)程,然后使用,關(guān)閉線(xiàn)程變成了將線(xiàn)程歸還到線(xiàn)程池。如果調(diào)用了線(xiàn)程池的方法,線(xiàn)程池會(huì)提前把核心線(xiàn)程都創(chuàng)造好,并啟動(dòng)線(xiàn)程池允許創(chuàng)建的最大線(xiàn)程數(shù)。 java高并發(fā)系列第18篇文章。 本文主要內(nèi)容 什么是線(xiàn)程池 線(xiàn)程池實(shí)現(xiàn)原理 線(xiàn)程池中常見(jiàn)的各種隊(duì)列 自定義線(xiàn)程創(chuàng)建的工廠 常見(jiàn)的飽和策略 自定義飽和策略 ...
摘要:中的線(xiàn)程池運(yùn)用場(chǎng)景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。代碼中如果執(zhí)行了方法,線(xiàn)程池會(huì)提前創(chuàng)建并啟動(dòng)所有核心線(xiàn)程。線(xiàn)程池最大數(shù)量線(xiàn)程池允許創(chuàng)建的線(xiàn)程最大數(shù)量。被稱(chēng)為是可重用固定線(xiàn)程數(shù)的線(xiàn)程池。 Java中的線(xiàn)程池運(yùn)用場(chǎng)景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。那么線(xiàn)程池有什么好處呢,以及他的實(shí)現(xiàn)原理是怎么樣的呢? 使用線(xiàn)程池的好處 在開(kāi)發(fā)過(guò)程中,合理的使用線(xiàn)程...
閱讀 1330·2021-11-24 09:38
閱讀 3268·2021-11-22 12:03
閱讀 4203·2021-11-11 10:59
閱讀 2334·2021-09-28 09:36
閱讀 1043·2021-09-09 09:32
閱讀 3434·2021-08-05 10:00
閱讀 2542·2021-07-23 15:30
閱讀 2985·2019-08-30 13:12