自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:線程池核心線程設(shè)置為0時(shí)任務(wù)執(zhí)行流程怎么樣的

開發(fā) 前端
線程池是Java中管理和重用線程的一種方式,也是實(shí)現(xiàn)并發(fā)編程的一種手段。通過使用線程池可以顯著提升多線程應(yīng)用程序的性能。

在面試時(shí),有的面試官就喜歡這種刁鉆角度的面試問題,如果你對(duì)線程池的任務(wù)執(zhí)行流程熟悉的話,那么該題就不會(huì)難住你。所以在開始之前,我們先看下線程池相關(guān)的知識(shí)。

本文使用 JDK8 演示。

一、概念

線程池是Java中管理和重用線程的一種方式,也是實(shí)現(xiàn)并發(fā)編程的一種手段。通過使用線程池可以顯著提升多線程應(yīng)用程序的性能。

線程池相對(duì)于線程來說,線程池主要解決了兩個(gè)問題,一個(gè)是線程的創(chuàng)建和銷毀代價(jià)大,另一個(gè)就是多線程并發(fā)執(zhí)行時(shí)可能導(dǎo)致系統(tǒng)資源不足的問題。

通過線程池,可以提前創(chuàng)建好一組一定數(shù)量的線程,并管理好這些線程的生命周期,也就是線程池中線程的存活時(shí)間,通過這些我們就可以在有需要的時(shí)候重用這些線程,減少創(chuàng)建和銷毀線程的開銷,提升系統(tǒng)的響應(yīng)速度和系統(tǒng)資源利用率。

二、線程池工作流程

線程池的任務(wù)執(zhí)行流程是怎么樣的呢?

  • 首先會(huì)判斷當(dāng)前工作線程數(shù)量是否大于核心線程數(shù)量(corePoolSize),如果小于核心線程數(shù)量,直接創(chuàng)建線程執(zhí)行任務(wù)。如果大于核心線程數(shù)量,就將任務(wù)放入任務(wù)隊(duì)列中進(jìn)行緩存。
  • 判斷任務(wù)隊(duì)列容量是否已滿,如果不滿,任務(wù)放入任務(wù)隊(duì)列。
  • 如果任務(wù)隊(duì)列滿了,判斷當(dāng)前工作線程數(shù)量是否大于最大線程數(shù)量(maximumPoolSize),如果小于最大線程數(shù)量,創(chuàng)建線程執(zhí)行任務(wù)。
  • 當(dāng)工作線程已經(jīng)大于最大線程了,此時(shí),任務(wù)會(huì)觸發(fā)拒絕策略,默認(rèn)的拒絕策略是拋出異常。

任務(wù)工作流程如下圖所示:

到了這你心中有結(jié)果了嗎,是不是線程池會(huì)把該任務(wù)丟入任務(wù)隊(duì)列呢,不著急,慢慢來,下面我們一起看下源碼中是如何判斷的。

三、源碼分析

1.寫個(gè)測(cè)試方法

在實(shí)際的工作中要注意設(shè)置線程名稱以及拒絕策略哦!

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(0,10,1000,
                TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1000), new NamedThreadFactory("zuiyu",false));

        threadPoolExecutor.execute(()->{
            System.out.println("醉魚Java");
        });
    }

2.Debug 一下

首先我們看一下execute方法就知道是如何了。

通過 debug 發(fā)現(xiàn),當(dāng)代碼運(yùn)行到圖中圈起來的代碼這一行時(shí),也就是當(dāng)工作線程數(shù)量為0時(shí),會(huì)執(zhí)行下一步的創(chuàng)建線程執(zhí)行任務(wù)。

最后程序輸出了《醉魚Java》,所以當(dāng)核心線程設(shè)置為 0 的時(shí)候,線程池會(huì)判斷當(dāng)前工作線程為0 時(shí),會(huì)創(chuàng)建線程執(zhí)行任務(wù)。

結(jié)論

通過簡單的 debug 了一下任務(wù)的執(zhí)行流程,核心線程設(shè)置為 0 時(shí),當(dāng)把任務(wù)丟入線程池,還是會(huì)把任務(wù)丟入任務(wù)隊(duì)列,但是也會(huì)在下一步進(jìn)行判斷當(dāng)前工作線程的線程數(shù)量是否為 0,如果為 0,也會(huì)創(chuàng)建線程進(jìn)行執(zhí)行任務(wù)。所以現(xiàn)在你懂了嗎?

責(zé)任編輯:趙寧寧 來源: 醉魚Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)