国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站發(fā)外鏈中山seo排名

網(wǎng)站發(fā)外鏈,中山seo排名,重慶新聞網(wǎng),公司做網(wǎng)站的費(fèi)用入賬多線程與線程池 文章目錄 多線程與線程池1. 相關(guān)概念1.1 線程調(diào)度1.2 守護(hù)線程 2. 生命周期3. 同步機(jī)制/同步鎖3.1 synchronized3.2 lock3.3 synchronized 與 Lock 的對(duì)比 4. 死鎖5. 線程通信5.1 線程間的通信5.2 等待喚醒機(jī)制5.3 舉例5.4 調(diào)用 wait 和 notify 需注意的細(xì)節(jié)5.5…

多線程與線程池

文章目錄

  • 多線程與線程池
    • 1. 相關(guān)概念
      • 1.1 線程調(diào)度
      • 1.2 守護(hù)線程
    • 2. 生命周期
    • 3. 同步機(jī)制/同步鎖
      • 3.1 synchronized
      • 3.2 lock
      • 3.3 synchronized 與 Lock 的對(duì)比
    • 4. 死鎖
    • 5. 線程通信
      • 5.1 線程間的通信
      • 5.2 等待喚醒機(jī)制
      • 5.3 舉例
      • 5.4 調(diào)用 wait 和 notify 需注意的細(xì)節(jié)
      • 5.5 生產(chǎn)者消費(fèi)者問(wèn)題
    • 6. 線程池
      • 6.1七大核心屬性
      • 6.2線程池處理流程圖
        • 6.2.1 線程池處理
        • 6.2.2 addWorker方法

1. 相關(guān)概念

1.1 線程調(diào)度

  • 分時(shí)調(diào)度:所有線程輪流使用 CPU 的使用權(quán),并且平均分配每個(gè)線程占用 CPU 的時(shí)間。
  • 搶占式調(diào)度:讓優(yōu)先級(jí)高的線程以較大的概率優(yōu)先使用 CPU。如果線程的優(yōu)先級(jí)相同,那么會(huì)隨機(jī)選擇一個(gè)(線程隨機(jī)性),Java 使用的為搶占式調(diào)度。

每個(gè)線程都有一定的優(yōu)先級(jí),同優(yōu)先級(jí)線程組成先進(jìn)先出隊(duì)列(先到先服務(wù)),使用分時(shí)調(diào)度策略。優(yōu)先級(jí)高的線程采用搶占式策略,獲得較多的執(zhí)行
機(jī)會(huì)。每個(gè)線程默認(rèn)的優(yōu)先級(jí)都與創(chuàng)建它的父線程具有相同的優(yōu)先級(jí)。:

  • Thread 類的三個(gè)優(yōu)先級(jí)常量:

    • MAX_PRIORITY(10):最高優(yōu)先級(jí)
    • MIN _PRIORITY (1):最低優(yōu)先級(jí)
    • NORM_PRIORITY (5):普通優(yōu)先級(jí),默認(rèn)情況下 main 線程具有普通優(yōu)先級(jí)

1.2 守護(hù)線程

有一種線程,它是在后臺(tái)運(yùn)行的,它的任務(wù)是為其他線程提供服務(wù)的,這種線程被稱為“守護(hù)線程”。JVM 的垃圾回收線程就是典型的守護(hù)線程。守護(hù)線程有個(gè)特點(diǎn),就是如果所有非守護(hù)線程都死亡,那么守護(hù)線程自動(dòng)死亡。形象理解:兔死狗烹,鳥盡弓藏

2. 生命周期

在 java.lang.Thread.State 的枚舉類中這樣定義:

public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;
}
  • NEW(新建):線程剛被創(chuàng)建,但是并未啟動(dòng)。還沒(méi)調(diào)用 start 方法。

  • RUNNABLE(可運(yùn)行):這里沒(méi)有區(qū)分就緒和運(yùn)行狀態(tài)。因?yàn)閷?duì)于 Java 對(duì)象來(lái)說(shuō),只能標(biāo)記為可運(yùn)行,至于什么時(shí)候運(yùn)行,不是 JVM 來(lái)控制的了,是 OS 來(lái)進(jìn)行調(diào)度的,而且時(shí)間非常短暫,因此對(duì)于 Java 對(duì)象的狀態(tài)來(lái)說(shuō),無(wú)法區(qū)分。

  • Teminated(被終止):表明此線程已經(jīng)結(jié)束生命周期,終止運(yùn)行。

  • BLOCKED(鎖阻塞):在 API 中的介紹為:一個(gè)正在阻塞、等待一個(gè)監(jiān)視器鎖(鎖對(duì)象)的線程處于這一狀態(tài)。只有獲得鎖對(duì)象的線程才能有執(zhí)行機(jī)會(huì)。

    比如,線程 A 與線程 B 代碼中使用同一鎖,如果線程 A 獲取到鎖,線程 A 進(jìn)入到 Runnable 狀態(tài),那么線程 B 就進(jìn)入到 Blocked鎖阻塞狀態(tài)。

  • TIMED_WAITING(計(jì)時(shí)等待):在 API 中的介紹為:一個(gè)正在限時(shí)等待另一個(gè)線程執(zhí)行一個(gè)(喚醒)動(dòng)作的線程處于這一狀態(tài)。

    當(dāng)前線程執(zhí)行過(guò)程中遇到 Thread 類的 sleep 或 join,Object 類的 wait,LockSupport 類的 park 方法,并且在調(diào)用這些方法時(shí),設(shè)置了時(shí)間,那么當(dāng)前線程會(huì)進(jìn)入 TIMED_WAITING,直到時(shí)間到,或被中斷。

  • WAITING(無(wú)限等待):在 API 中介紹為:一個(gè)正在無(wú)限期等待另一個(gè)線程執(zhí)行一個(gè)特別的(喚醒)動(dòng)作的線程處于這一狀態(tài)。

    當(dāng)前線程執(zhí)行過(guò)程中遇到遇到 Object 類的 wait,Thread 類的join,LockSupport 類的 park 方法,并且在調(diào)用這些方法時(shí),沒(méi)有指定時(shí)間,那么當(dāng)前線程會(huì)進(jìn)入 WAITING 狀態(tài),直到被喚醒。

說(shuō)明:當(dāng)從 WAITING 或 TIMED_WAITING 恢復(fù)到 Runnable 狀態(tài)時(shí),如果發(fā)現(xiàn)當(dāng)前線程沒(méi)有得到監(jiān)視器鎖,那么會(huì)立刻轉(zhuǎn)入 BLOCKED 狀態(tài)。

在這里插入圖片描述

3. 同步機(jī)制/同步鎖

3.1 synchronized

同步鎖對(duì)象可以是任意類型,但是必須保證競(jìng)爭(zhēng)“同一個(gè)共享資源”的多個(gè)線程必須使用同一個(gè)“同步鎖對(duì)象”。

3.2 lock

  • 保證線程的安全。與采用 synchronized 相比,Lock 可提供多種鎖方案,更靈活、更強(qiáng)大。Lock 通過(guò)顯式定義同步鎖對(duì)象來(lái)實(shí)現(xiàn)同步。同步鎖使用Lock 對(duì)象充當(dāng)。

  • java.util.concurrent.locks.Lock 接口是控制多個(gè)線程對(duì)共享資源進(jìn)行訪問(wèn)的工具。鎖提供了對(duì)共享資源的獨(dú)占訪問(wèn),每次只能有一個(gè)線程對(duì) Lock 對(duì)象加鎖,線程開始訪問(wèn)共享資源之前應(yīng)先獲得 Lock 對(duì)象。

  • 在實(shí)現(xiàn)線程安全的控制中,比較常用的是 ReentrantLock,可以顯式加鎖、釋放鎖。

    ReentrantLock 類實(shí)現(xiàn)了 Lock 接口,它擁有與 synchronized 相同的并發(fā)性和內(nèi)存語(yǔ)義,但是添加了類似鎖投票、定時(shí)鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭(zhēng)用情況下更佳的性能。

3.3 synchronized 與 Lock 的對(duì)比

  1. Lock 是顯式鎖(手動(dòng)開啟和關(guān)閉鎖,別忘記關(guān)閉鎖),synchronized 是隱式鎖,出了作用域、遇到異常等自動(dòng)解鎖

  2. Lock 只有代碼塊鎖,synchronized 有代碼塊鎖和方法鎖

  3. 使用 Lock 鎖,JVM 將花費(fèi)較少的時(shí)間來(lái)調(diào)度線程,性能更好。并且具有更好的擴(kuò)展性(提供更多的子類,讀寫鎖等),更體現(xiàn)面向?qū)ο蟆?/p>

說(shuō)明:開發(fā)建議中處理線程安全問(wèn)題優(yōu)先使用順序?yàn)?#xff1a;Lock ----> 同步代碼塊 ----> 同步方法

4. 死鎖

同步機(jī)制帶來(lái)的死鎖問(wèn)題:不同的線程分別占用對(duì)方需要的同步資源不放棄,都在等待對(duì)方放棄自己需要的同步資源,就形成了線程的死鎖。

  • 互斥條件:進(jìn)程要求對(duì)所分配的資源進(jìn)行排它性控制,即在一段時(shí)間內(nèi)某資源僅為一進(jìn)程所占用。
  • 請(qǐng)求和保持條件:當(dāng)進(jìn)程因請(qǐng)求資源而阻塞時(shí),對(duì)已獲得的資源保持不放。
  • 不剝奪條件:進(jìn)程已獲得的資源在未使用完之前,不能剝奪,只能在使用完時(shí)由自己釋放。
  • 循環(huán)等待:存在一個(gè)進(jìn)程或線程的資源申請(qǐng)序列,使得每個(gè)進(jìn)程或線程都在等待下一個(gè)進(jìn)程或線程所持有的資源。

解決死鎖:死鎖一旦出現(xiàn),基本很難人為干預(yù),只能盡量規(guī)避??梢钥紤]打破上面的誘發(fā)條件。

  • 針對(duì)互斥條件:互斥條件基本上無(wú)法被破壞。因?yàn)榫€程需要通過(guò)互斥解決安全問(wèn)題。
  • 針對(duì)請(qǐng)求和保持條件:可以考慮一次性申請(qǐng)所有所需的資源,這樣就不存在等待的問(wèn)題。
  • 針對(duì)不剝奪條件:占用部分資源的線程在進(jìn)一步申請(qǐng)其他資源時(shí),如果申請(qǐng)不到,就主動(dòng)釋放掉已經(jīng)占用的資源。
  • 針對(duì)循環(huán)等待:可以將資源改為線性順序。申請(qǐng)資源時(shí),先申請(qǐng)序號(hào)較小的,這樣避免循環(huán)等待問(wèn)題。

5. 線程通信

5.1 線程間的通信

當(dāng)我們需要多個(gè)線程來(lái)共同完成一件任務(wù),并且我們希望他們有規(guī)律的執(zhí)行,那么多線程之間需要一些通信機(jī)制,可以協(xié)調(diào)它們的工作,以此實(shí)現(xiàn)多線程共同操作一份數(shù)據(jù)。

比如:線程 A 用來(lái)生產(chǎn)包子的,線程 B 用來(lái)吃包子的,包子可以理解為同一資源,線程 A 與線程 B 處理的動(dòng)作,一個(gè)是生產(chǎn),一個(gè)是消費(fèi),此時(shí) B 線程必須等到 A 線程完成后才能執(zhí)行,那么線程 A 與線程 B 之間就需要線程通信,即—— 等待喚醒機(jī)制。

5.2 等待喚醒機(jī)制

這是多個(gè)線程間的一種協(xié)作機(jī)制。談到線程我們經(jīng)常想到的是線程間的競(jìng)爭(zhēng)(race),比如去爭(zhēng)奪鎖,但這并不是故事的全部,線程間也會(huì)有協(xié)作機(jī)制。在一個(gè)線程滿足某個(gè)條件時(shí),就進(jìn)入等待狀態(tài)(wait() / wait(time)), 等待其他線程執(zhí)行完他們的指定代碼過(guò)后再將其喚醒(notify());或可以指定wait 的時(shí)間,等時(shí)間到了自動(dòng)喚醒;在有多個(gè)線程進(jìn)行等待時(shí),如果需要,可以使用 notifyAll()來(lái)喚醒所有的等待線程。wait/notify 就是線程間的一種協(xié)作機(jī)制。

  1. wait:線程不再活動(dòng),不再參與調(diào)度,進(jìn)入 wait set 中,因此不會(huì)浪費(fèi) CPU 資源,也不會(huì)去競(jìng)爭(zhēng)鎖了,這時(shí)的線程狀態(tài)是 WAITING 或 TIMED_WAITING。它
    還要等著別的線程執(zhí)行一個(gè)特別的動(dòng)作,也即“通知(notify)”或者等待時(shí)間到,在這個(gè)對(duì)象上等待的線程從 wait set 中釋放出來(lái),重新進(jìn)入到調(diào)度隊(duì)(ready queue)中
  2. notify:則選取所通知對(duì)象的 wait set 中的一個(gè)線程釋放;
  3. notifyAll:則釋放所通知對(duì)象的 wait set 上的全部線程。

注意:被通知的線程被喚醒后也不一定能立即恢復(fù)執(zhí)行,因?yàn)樗?dāng)初中斷的地方是在同步塊內(nèi),而此刻它已經(jīng)不持有鎖,所以它需要再次嘗試去獲取鎖(很可能面臨其它線程的競(jìng)爭(zhēng)),成功后才能在當(dāng)初調(diào)用 wait 方法之后的地方恢復(fù)執(zhí)行。

  • 如果能獲取鎖,線程就從 WAITING 狀態(tài)變成 RUNNABLE(可運(yùn)行)狀態(tài);
  • 否則,線程就從 WAITING 狀態(tài)又變成 BLOCKED(等待鎖) 狀態(tài)

注意:在JUC中將會(huì)學(xué)到更多有關(guān)等待喚醒機(jī)制的類與方法,建議使用JUC中學(xué)習(xí)到的

5.3 舉例

例題:使用兩個(gè)線程打印 1-100。線程 1, 線程 2 交替打印

class Communication implements Runnable {int i = 1;public void run() {while (true) {synchronized (this) {notify();if (i <= 100) {System.out.println(Thread.currentThread().getName() + ":" + i++);} else break;try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
}

5.4 調(diào)用 wait 和 notify 需注意的細(xì)節(jié)

  1. wait 方法與 notify 方法必須要由同一個(gè)鎖對(duì)象調(diào)用。因?yàn)?#xff1a;對(duì)應(yīng)的鎖對(duì)象可以通過(guò) notify 喚醒使用同一個(gè)鎖對(duì)象調(diào)用的 wait 方法后的線程。
  2. wait 方法與 notify 方法是屬于 Object 類的方法的。因?yàn)?#xff1a;鎖對(duì)象可以是任意對(duì)象,而任意對(duì)象的所屬類都是繼承了 Object 類的。
  3. wait 方法與 notify 方法必須要在同步代碼塊或者是同步函數(shù)中使用。因?yàn)?#xff1a;必須要通過(guò)鎖對(duì)象調(diào)用這 2 個(gè)方法。否則會(huì)報(bào) java.lang.IllegalMonitorStateException 異常。

5.5 生產(chǎn)者消費(fèi)者問(wèn)題

等待喚醒機(jī)制可以解決經(jīng)典的“生產(chǎn)者與消費(fèi)者”的問(wèn)題。生產(chǎn)者與消費(fèi)者問(wèn)題(英語(yǔ):Producer-consumer problem),也稱有限緩沖問(wèn)題(英語(yǔ):Bounded-buffer problem),是一個(gè)多線程同步問(wèn)題的經(jīng)典案例。該問(wèn)題描述了兩個(gè)(多個(gè))共享固定大小緩沖區(qū)的線程——即所謂的“生產(chǎn)者”和“消費(fèi)者”——在實(shí)際運(yùn)行時(shí)會(huì)發(fā)生的問(wèn)題。

生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩沖區(qū)中,然后重復(fù)此過(guò)程。與此同時(shí),消費(fèi)者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問(wèn)題的關(guān)鍵就是要保證生產(chǎn)者不會(huì)在緩沖區(qū)滿時(shí)加入數(shù)據(jù),消費(fèi)者也不會(huì)在緩沖區(qū)中空時(shí)消耗數(shù)據(jù)。

舉例:

生產(chǎn)者(Productor)將產(chǎn)品交給店員(Clerk),而消費(fèi)者(Customer)從店員處取走產(chǎn)品,店員一次只能持有固定數(shù)量的產(chǎn)品(比如:20),如果生產(chǎn)者試圖生產(chǎn)更多的產(chǎn)品,店員會(huì)叫生產(chǎn)者停一下,如果店中有空位放產(chǎn)品了再通知生產(chǎn)者繼續(xù)生產(chǎn);如果店中沒(méi)有產(chǎn)品了,店員會(huì)告訴消費(fèi)者等一下,如果店中有產(chǎn)品了再通知消費(fèi)者來(lái)取走產(chǎn)品。

生產(chǎn)者與消費(fèi)者問(wèn)題中其實(shí)隱含了兩個(gè)問(wèn)題:

  • 線程安全問(wèn)題:因?yàn)樯a(chǎn)者與消費(fèi)者共享數(shù)據(jù)緩沖區(qū),產(chǎn)生安全問(wèn)題。不過(guò)這個(gè)問(wèn)題可以使用同步解決。
  • 線程的協(xié)調(diào)工作問(wèn)題:要解決該問(wèn)題,就必須讓生產(chǎn)者線程在緩沖區(qū)滿時(shí)等待(wait),暫停進(jìn)入阻塞狀態(tài),等到下次消費(fèi)者消耗了緩沖區(qū)中的數(shù)據(jù)的時(shí)候,通知(notify)正在等待的線程恢復(fù)到就緒狀態(tài),重新開始往緩沖區(qū)添加數(shù)據(jù)。同樣,也可以讓消費(fèi)者線程在緩沖區(qū)空時(shí)進(jìn)入等待(wait),暫停進(jìn)入阻塞狀態(tài),等到生產(chǎn)者往緩沖區(qū)添加數(shù)據(jù)之后,再通知(notify)正在等待的線程恢復(fù)到就緒狀態(tài)。通過(guò)這樣的通信機(jī)制來(lái)解決此類問(wèn)題。

代碼實(shí)現(xiàn):

public class ConsumerProducerTest {public static void main(String[] args) {Clerk clerk = new Clerk();Producer p1 = new Producer(clerk);Consumer c1 = new Consumer(clerk);Consumer c2 = new Consumer(clerk);p1.setName("生產(chǎn)者 1");c1.setName("消費(fèi)者 1");c2.setName("消費(fèi)者 2");p1.start();c1.start();c2.start();}
}//生產(chǎn)者
class Producer extends Thread{private Clerk clerk;public Producer(Clerk clerk){this.clerk = clerk;}@Overridepublic void run() {System.out.println("=========生產(chǎn)者開始生產(chǎn)產(chǎn)品========");while(true){try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}//要求 clerk 去增加產(chǎn)品clerk.addProduct();}}
}//消費(fèi)者
class Consumer extends Thread{private Clerk clerk;public Consumer(Clerk clerk){this.clerk = clerk;}@Overridepublic void run() {System.out.println("=========消費(fèi)者開始消費(fèi)產(chǎn)品========");while(true){try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}//要求 clerk 去減少產(chǎn)品clerk.minusProduct();}}
}//資源類,緩沖區(qū)
class Clerk {private int productNum = 0;//產(chǎn)品數(shù)量private static final int MAX_PRODUCT = 20;private static final int MIN_PRODUCT = 1;//增加產(chǎn)品public synchronized void addProduct() {if(productNum < MAX_PRODUCT){productNum++;System.out.println(Thread.currentThread().getName() +"生產(chǎn)了第" + productNum + "個(gè)產(chǎn)品");//喚醒消費(fèi)者this.notifyAll();}else{try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}//減少產(chǎn)品public synchronized void minusProduct() {if(productNum >= MIN_PRODUCT){System.out.println(Thread.currentThread().getName() +"消費(fèi)了第" + productNum + "個(gè)產(chǎn)品");productNum--;//喚醒生產(chǎn)者this.notifyAll();}else{try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}
}

6. 線程池

如果并發(fā)的線程數(shù)量很多,并且每個(gè)線程都是執(zhí)行一個(gè)時(shí)間很短的任務(wù)就結(jié)束了,這樣頻繁創(chuàng)建線程就會(huì)大大降低系統(tǒng)的效率,因?yàn)轭l繁創(chuàng)建線程和銷毀線程需要的代價(jià)較高。

思路:提前創(chuàng)建好多個(gè)線程,放入線程池中,使用時(shí)直接獲取,使用完放回池中??梢员苊忸l繁創(chuàng)建銷毀、實(shí)現(xiàn)重復(fù)利用。類似生活中的公共交通工具。

注意:線程資源必須通過(guò)線程池提供,不允許在應(yīng)用中自行顯示創(chuàng)建線程。

引用阿里《Java開發(fā)手冊(cè)》中的一段描述:

【強(qiáng)制】線程池不允許使用Executors創(chuàng)建,建議通過(guò)ThreadPoolExecutor的方式創(chuàng)建,這樣的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險(xiǎn)。

說(shuō)明:Executors返回的線程池對(duì)象的弊端如下:

1.FixedThreadPool和SingleThreadPool:

允許的請(qǐng)求隊(duì)列長(zhǎng)度為Integet.MAX_VALUE,可能會(huì)堆積大量的請(qǐng)求從而導(dǎo)致OOM;

2.CachedThreadPool:

允許創(chuàng)建線程數(shù)量為Integet.MAX_VALUE,可能會(huì)創(chuàng)建大量的線程,從而導(dǎo)致OOM.

6.1七大核心屬性

  1. corePoolSize(int):核心線程數(shù)量。默認(rèn)情況下,線程池中的線程數(shù)為0,當(dāng)有任務(wù)來(lái)之后,就會(huì)創(chuàng)建一個(gè)線程去執(zhí)行任務(wù),當(dāng)線程池中的線程數(shù)目達(dá)到corePoolSize后,就會(huì)把到達(dá)的任務(wù)放到任務(wù)隊(duì)列當(dāng)中。線程池將長(zhǎng)期保證這些線程處于存活狀態(tài),即使線程已經(jīng)處于閑置狀態(tài)。除非配置了allowCoreThreadTimeOut=true,核心線程數(shù)的線程也將不再保證長(zhǎng)期存活于線程池內(nèi),在空閑時(shí)間超過(guò)keepAliveTime后被銷毀。
  2. workQueue:阻塞隊(duì)列,存放等待執(zhí)行的任務(wù),線程從workQueue中取任務(wù),若無(wú)任務(wù)將阻塞等待。當(dāng)線程池中線程數(shù)量達(dá)到corePoolSize后,就會(huì)把新任務(wù)放到該隊(duì)列當(dāng)中。JDK提供了四個(gè)可直接使用的隊(duì)列實(shí)現(xiàn),分別是:基于數(shù)組的有界隊(duì)列ArrayBlockingQueue、基于鏈表的無(wú)界隊(duì)列LinkedBlockingQueue、只有一個(gè)元素的同步隊(duì)列SynchronousQueue、優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue。在實(shí)際使用時(shí)一定要設(shè)置隊(duì)列長(zhǎng)度。
  3. maximumPoolSize(int):線程池內(nèi)的最大線程數(shù)量,線程池內(nèi)維護(hù)的線程不得超過(guò)該數(shù)量,大于核心線程數(shù)量小于最大線程數(shù)量的線程將在空閑時(shí)間超過(guò)keepAliveTime后被銷毀。當(dāng)阻塞隊(duì)列存滿后,將會(huì)創(chuàng)建新線程執(zhí)行任務(wù),線程的數(shù)量不會(huì)大于maximumPoolSize。
  4. keepAliveTime(long):線程存活時(shí)間,若線程數(shù)超過(guò)了corePoolSize,線程閑置時(shí)間超過(guò)了存活時(shí)間,該線程將被銷毀。除非配置了allowCoreThreadTimeOut=true,核心線程數(shù)的線程也將不再保證長(zhǎng)期存活于線程池內(nèi),在空閑時(shí)間超過(guò)keepAliveTime后被銷毀。
  5. TimeUnit unit:線程存活時(shí)間的單位,例如TimeUnit.SECONDS表示秒。
  6. RejectedExecutionHandler:拒絕策略,當(dāng)任務(wù)隊(duì)列存滿并且線程池個(gè)數(shù)達(dá)到maximunPoolSize后采取的策略。ThreadPoolExecutor中提供了四種拒絕策略,分別是:拋RejectedExecutionException異常的AbortPolicy(默認(rèn)策略)、使用調(diào)用者所在線程來(lái)運(yùn)行任務(wù)CallerRunsPolicy、丟棄一個(gè)等待執(zhí)行的任務(wù),然后嘗試執(zhí)行當(dāng)前任務(wù)DiscardOldestPolicy、不動(dòng)聲色的丟棄并且不拋異常DiscardPolicy。項(xiàng)目中如果為了更多的用戶體驗(yàn),可以自定義拒絕策略。
  7. threadFactory:創(chuàng)建線程的工廠,雖說(shuō)JDK提供了線程工廠的默認(rèn)實(shí)現(xiàn)DefaultThreadFactory,但還是建議自定義實(shí)現(xiàn)最好,這樣可以自定義線程創(chuàng)建的過(guò)程,例如線程分組、自定義線程名稱等以進(jìn)行線程監(jiān)控。

6.2線程池處理流程圖

6.2.1 線程池處理

在這里插入圖片描述

拒絕策略:RejectedExecutionHandler

當(dāng)任務(wù)隊(duì)列和線程池都滿了時(shí)所采取的應(yīng)對(duì)策略,默認(rèn)是AbordPolicy,表示無(wú)法處理新任務(wù),并拋出RejectedExecutionException異常。此外還有3種策略:

  • CallerRunsPolicy:用調(diào)用者所在的線程處理任務(wù)。此策略提供簡(jiǎn)單的反饋機(jī)制,能夠減緩新任務(wù)的提交速度。
  • DiscardPolicy:不能執(zhí)行任務(wù),并將任務(wù)刪除。
  • DiscardOldestPolicy:丟棄隊(duì)列最近的任務(wù),并執(zhí)行當(dāng)前的任務(wù)。
6.2.2 addWorker方法

該方法返回false則會(huì)執(zhí)行拒絕策略方法

主流程圖:

在這里插入圖片描述

流程中去除一些異常情況,只留了主要流程,流程中有一步驗(yàn)證線程數(shù)大于核心線程或者最大線程數(shù),如果傳遞的參數(shù)core等于true那么運(yùn)行線程數(shù)量不能大于核心線程數(shù)量,如果為false則當(dāng)前線程數(shù)量不能大于最大。

addWorker只有兩個(gè)作用:增加工作線程數(shù)量、創(chuàng)建一個(gè)Worker并加到工作線程集合中。

http://aloenet.com.cn/news/30424.html

相關(guān)文章:

  • 四川移動(dòng)網(wǎng)站建設(shè)怎樣做推廣是免費(fèi)的
  • 網(wǎng)頁(yè)界面設(shè)計(jì)系統(tǒng)seo描述是什么
  • 網(wǎng)頁(yè)設(shè)計(jì)軟件adobe鄭州seo技術(shù)顧問(wèn)
  • ui設(shè)計(jì)培訓(xùn)需要多少費(fèi)用百度關(guān)鍵詞搜索優(yōu)化
  • 織夢(mèng)網(wǎng)站動(dòng)態(tài)網(wǎng)站建設(shè)推廣優(yōu)化
  • 老鷹畫室網(wǎng)站哪家做的b站視頻怎么快速推廣
  • 建網(wǎng)站怎么分類亞馬遜關(guān)鍵詞搜索器
  • 吳江做網(wǎng)站建站abc官方網(wǎng)站
  • 佛山外貿(mào)型網(wǎng)站如何做好一個(gè)網(wǎng)站
  • 網(wǎng)站知識(shí)介紹杭州網(wǎng)站建設(shè)
  • 百度網(wǎng)站托管網(wǎng)站統(tǒng)計(jì)哪個(gè)好用
  • 淘寶上買衣服的網(wǎng)站湖南企業(yè)seo優(yōu)化首選
  • 手機(jī)端網(wǎng)站做app阿里巴巴怎么優(yōu)化關(guān)鍵詞排名
  • 中小企業(yè)融資服務(wù)平臺(tái)專業(yè)seo整站優(yōu)化
  • 網(wǎng)站的優(yōu)化承諾上海最新新聞熱點(diǎn)事件
  • 泰州網(wǎng)站建設(shè)方案視頻運(yùn)營(yíng)管理平臺(tái)
  • 小公司怎么做免費(fèi)網(wǎng)站西安網(wǎng)站seo優(yōu)化公司
  • 鄭州市建設(shè)廳網(wǎng)站網(wǎng)絡(luò)營(yíng)銷的現(xiàn)狀
  • 群暉 docker wordpress廣州百度推廣優(yōu)化排名
  • l建設(shè)銀行網(wǎng)站深圳最新消息
  • 精品網(wǎng)站建設(shè)多少錢seo怎么優(yōu)化網(wǎng)站排名
  • 如何做網(wǎng)站的優(yōu)化網(wǎng)絡(luò)營(yíng)銷好找工作嗎
  • 北京南站到北京西站新手如何學(xué)seo
  • 專業(yè)做破碎機(jī)的網(wǎng)站百度在線使用
  • 沈陽(yáng)做網(wǎng)站哪個(gè)好軟文寫作平臺(tái)
  • 深圳羅湖網(wǎng)站建設(shè)公司如何推廣網(wǎng)站
  • 外貿(mào)選品網(wǎng)站今天國(guó)內(nèi)最新消息
  • 永久空間網(wǎng)站鄭州高端網(wǎng)站建設(shè)
  • 做如美團(tuán)式網(wǎng)站要多少錢今日最新足球推薦
  • 企業(yè)做網(wǎng)站有什么好處公眾號(hào)軟文范例100