總結(jié)的非常好
ForkJoinPool in Java-- ForkJoinPool -- ForkJoinPool與ThreadPool的不同是:ForkJoinPool中的任務(wù)是有同步關(guān)系的,某個(gè)任務(wù)必須在其它的某個(gè)/某些...
總結(jié)的非常好
ForkJoinPool in Java-- ForkJoinPool -- ForkJoinPool與ThreadPool的不同是:ForkJoinPool中的任務(wù)是有同步關(guān)系的,某個(gè)任務(wù)必須在其它的某個(gè)/某些...
非常感謝你的文章!如果沒有這篇文章,可能我還得看很久才能理出頭緒。非常感謝!
有幾處我看到的和文章中說的不一樣。寫下來,可做討論:
1. workQueues的偶數(shù)位置(外部提交的任務(wù))是不配線程的。它們是shared的,就是總是被偷去執(zhí)行的。
2. 外部提交的任務(wù)不是隨機(jī)找位置的,是確定的。每個(gè)線程維護(hù)一個(gè)數(shù)(probe),只要這個(gè)數(shù)不變,每次提交任務(wù)都到同一個(gè)任務(wù)隊(duì)列;如果那個(gè)隊(duì)列太忙了,就會提交失敗,這時(shí)候就把數(shù)變一下,重新提交,直到成功,將來的任務(wù)也都會提交到這個(gè)新地方。
3. 子任務(wù)fork()出來的新任務(wù)永遠(yuǎn)放在執(zhí)行它的worker所擁有的隊(duì)列里。如果它不被偷,就是原來的隊(duì)列;如果被偷了,就是偷竊者的隊(duì)列。
4. 新的任務(wù)隊(duì)列及其對應(yīng)的worker線程的產(chǎn)生是被動的方式:每當(dāng)有新任務(wù)來的時(shí)候,都會調(diào)用signalWork()方法。這個(gè)方法檢查當(dāng)前的線程是否夠用,如果不夠用,就釋放一個(gè)閑置線程(idle worker);如果沒有閑置線程,就創(chuàng)建一個(gè)新線程。新線程創(chuàng)建后,配給它一個(gè)新建的任務(wù)隊(duì)列,然后在workQueues里找一個(gè)合適的位置(奇數(shù)位置)把任務(wù)隊(duì)列放進(jìn)去,這個(gè)位置不是隨機(jī)的,而是算出來的:從上一次新建隊(duì)列的位置向后移動一個(gè)固定的偏移量。
5. 補(bǔ)償線程的意思是:一個(gè)線程執(zhí)行join()的時(shí)候知道自己注定要去block了,因此喚醒或者新建一個(gè)線程補(bǔ)償自己block之后的算力損失。
樓主能否對線程池能創(chuàng)建的最大線程數(shù)與構(gòu)造參數(shù)并行度之間的關(guān)系,盡量量化分析
JUC源碼分析-線程池篇(五):ForkJoinPool - 2通過上一篇(JUC源碼分析-線程池篇(四):ForkJoinPool - 1)的講解,相信同學(xué)們對 ForkJoinPool 已經(jīng)有了一個(gè)大概的認(rèn)識,本篇我們將通過分析源碼的...
導(dǎo)讀 代理模式就是自己做不了或不想做的事情找別人做,比如我們買不到票,找黃牛買,這就是代理模式。 代理模式分為調(diào)用方、代理、目標(biāo)三部分。 我們常用的Java代理模式主要有兩種...
本文通過探析JDK提供的,在開源項(xiàng)目中比較常用的Java SPI機(jī)制,希望給大家在實(shí)際開發(fā)實(shí)踐、學(xué)習(xí)開源項(xiàng)目提供參考。 1 SPI是什么 SPI全稱Service Provi...
前言 我們之前分析了Hash的源碼,主要是 put 方法。同時(shí),我們知道,HashMap 在并發(fā)的時(shí)候是不安全的,為什么呢?因?yàn)楫?dāng)多個(gè)線程對 Map 進(jìn)行擴(kuò)容會導(dǎo)致鏈表成環(huán)。...