黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 職業(yè)指南 2023年常見必考的線程池面試題

2023年常見必考的線程池面試題

更新時(shí)間:2022-12-27 10:30:15 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1376次

對(duì)于廣大程序員來說,線程池一定是不陌生的,線程池是一種多線程的處理形式,也是我們?cè)趨⒓覬ava開發(fā)面試中必考的知識(shí)點(diǎn),也是重點(diǎn)的考核題目之一,為了能夠更順利的讓大家通過面試,小編特別整理了這些線程池經(jīng)典問題,希望可以幫助到大家:

線程池面試題

1. 為什么要用線程池? 不能直接new個(gè)線程嗎?

如果我們?cè)诜椒ㄖ兄苯觧ew一個(gè)線程來處理,當(dāng)這個(gè)方法被調(diào)用頻繁時(shí)就會(huì)創(chuàng)建很多線程,不僅會(huì)消耗系統(tǒng)資源,還會(huì)降低系統(tǒng)的穩(wěn)定性。

降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程,降低線程創(chuàng)建和銷毀造成的消耗。

提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。

增加線程的可管理型。線程是稀缺資源,使用線程池可以進(jìn)行統(tǒng)一分配,調(diào)優(yōu)和監(jiān)控。

2. 線程池的核心屬性有哪些?

threadFactory(線程工廠):用于創(chuàng)建工作線程的工廠

corePoolSize(核心線程數(shù)):當(dāng)線程池運(yùn)行的線程少于 corePoolSize 時(shí),將創(chuàng)建一個(gè)新線程來處理請(qǐng)求,即使其他工作線程處于空閑狀態(tài)

workQueue(隊(duì)列):用于保留任務(wù)并移交給工作線程的阻塞隊(duì)列

maximumPoolSize(最大線程數(shù)):線程池允許開啟的最大線程數(shù)

handler(拒絕策略):往線程池添加任務(wù)時(shí),將在下面兩種情況觸發(fā)拒絕策略:1)線程池運(yùn)行狀態(tài)不是 RUNNING;2)線程池已經(jīng)達(dá)到最大線程數(shù),并且阻塞隊(duì)列已滿時(shí)

keepAliveTime(保持存活時(shí)間):如果線程池當(dāng)前線程數(shù)超過 corePoolSize,則多余的線程空閑時(shí)間超過 keepAliveTime 時(shí)會(huì)被終止

unit(空閑線程存活時(shí)間單位):keepAliveTime 的計(jì)量單位

3. 線程池的執(zhí)行流程?

//線程池實(shí)現(xiàn)原理    
	public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        /*
         * Proceed in 3 steps:
         *
         * 1. If fewer than corePoolSize threads are running, try to
         * start a new thread with the given command as its first
         * task.  The call to addWorker atomically checks runState and
         * workerCount, and so prevents false alarms that would add
         * threads when it shouldn't, by returning false.
         *
         * 2. If a task can be successfully queued, then we still need
         * to double-check whether we should have added a thread
         * (because existing ones died since last checking) or that
         * the pool shut down since entry into this method. So we
         * recheck state and if necessary roll back the enqueuing if
         * stopped, or start a new thread if there are none.
         *
         * 3. If we cannot queue task, then we try to add a new
         * thread.  If it fails, we know we are shut down or saturated
         * and so reject the task.
         */
        int c = ctl.get();
        // 1.?先判斷當(dāng)前線程池中之?的任務(wù)數(shù)量是否小于 corePoolSize
 			// 如果小于的話,通過addWorker(command, true)新建?個(gè)線程,并將任務(wù)(command)
			//添加到該線程中;然后,啟動(dòng)該線程從?執(zhí)?任務(wù)。
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //2.如果當(dāng)前執(zhí)行的任務(wù)數(shù)量?于等于 corePoolSize 的時(shí)候就會(huì)?到這
        // 通過 isRunning ?法判斷線程池狀態(tài),線程池處于 RUNNING 狀態(tài)才會(huì)被阻塞隊(duì)列加?任務(wù),該任務(wù)才會(huì)被加?進(jìn)去
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            
            // 再次獲取線程池狀態(tài),如果線程池狀態(tài)不是 RUNNING 狀態(tài)就需要從任務(wù)隊(duì)列中移除任務(wù),并嘗試判斷線程是否全部執(zhí)?完畢。同時(shí)執(zhí)?拒絕策略。
            if (! isRunning(recheck) && remove(command))
                reject(command);
            // 如果當(dāng)前線程池為空就新創(chuàng)建?個(gè)線程并執(zhí)?
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        
        //3. 通過addWorker(command, false)新建?個(gè)線程,
        	//并將任務(wù)(command)添加到該線程中;然后,啟動(dòng)該線程從?執(zhí)?任務(wù)。
 			//如果addWorker(command, false)執(zhí)?失敗,則通過reject()執(zhí)?相應(yīng)的拒絕策略的內(nèi)容。
        else if (!addWorker(command, false))
            reject(command);
    }

4. Executors 提供了哪些創(chuàng)建線程池的方法?

newFixedThreadPool:固定線程數(shù)的線程池。corePoolSize = maximumPoolSize,keepAliveTime為0,工作隊(duì)列使用無界的LinkedBlockingQueue。適用于為了滿足資源管理的需求,而需要限制當(dāng)前線程數(shù)量的場(chǎng)景,適用于負(fù)載比較重的服務(wù)器。

newSingleThreadExecutor:只有一個(gè)線程的線程池。corePoolSize = maximumPoolSize = 1,keepAliveTime為0, 工作隊(duì)列使用無界的LinkedBlockingQueue。適用于需要保證順序的執(zhí)行各個(gè)任務(wù)的場(chǎng)景。

newCachedThreadPool: 按需要?jiǎng)?chuàng)建新線程的線程池。核心線程數(shù)為0,最大線程數(shù)為 Integer.MAX_VALUE,keepAliveTime為60秒,工作隊(duì)列使用同步移交 SynchronousQueue。該線程池可以無限擴(kuò)展,當(dāng)需求增加時(shí),可以添加新的線程,而當(dāng)需求降低時(shí)會(huì)自動(dòng)回收空閑線程。適用于執(zhí)行很多的短期異步任務(wù),或者是負(fù)載較輕的服務(wù)器。

newScheduledThreadPool:創(chuàng)建一個(gè)以延遲或定時(shí)的方式來執(zhí)行任務(wù)的線程池,工作隊(duì)列為 DelayedWorkQueue。適用于需要多個(gè)后臺(tái)線程執(zhí)行周期任務(wù)。

newWorkStealingPool:JDK 1.8 新增,用于創(chuàng)建一個(gè)可以竊取的線程池,底層使用 ForkJoinPool 實(shí)現(xiàn)。

5. 使用隊(duì)列有什么需要注意的嗎?

使用有界隊(duì)列時(shí),需要注意線程池滿了后,被拒絕的任務(wù)如何處理。

使用無界隊(duì)列時(shí),需要注意如果任務(wù)的提交速度大于線程池的處理速度,可能會(huì)導(dǎo)致內(nèi)存溢出。

6. 線程池有哪些拒絕策略?

AbortPolicy:中止策略。默認(rèn)的拒絕策略,直接拋出 RejectedExecutionException。調(diào)用者可以捕獲這個(gè)異常,然后根據(jù)需求編寫自己的處理代碼。

DiscardPolicy:拋棄策略。什么都不做,直接拋棄被拒絕的任務(wù)。

DiscardOldestPolicy:拋棄最老策略。拋棄阻塞隊(duì)列中最老的任務(wù),相當(dāng)于就是隊(duì)列中下一個(gè)將要被執(zhí)行的任務(wù),然后重新提交被拒絕的任務(wù)。如果阻塞隊(duì)列是一個(gè)優(yōu)先隊(duì)列,那么“拋棄最舊的”策略將導(dǎo)致拋棄優(yōu)先級(jí)最高的任務(wù),因此最好不要將該策略和優(yōu)先級(jí)隊(duì)列放在一起使用。

CallerRunsPolicy:調(diào)用者運(yùn)行策略。在調(diào)用者線程中執(zhí)行該任務(wù)。該策略實(shí)現(xiàn)了一種調(diào)節(jié)機(jī)制,該策略既不會(huì)拋棄任務(wù),也不會(huì)拋出異常,而是將任務(wù)回退到調(diào)用者(調(diào)用線程池執(zhí)行任務(wù)的主線程),由于執(zhí)行任務(wù)需要一定時(shí)間,因此主線程至少在一段時(shí)間內(nèi)不能提交任務(wù),從而使得線程池有時(shí)間來處理完正在執(zhí)行的任務(wù)。

以上就是“2023年常見必考的線程池面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動(dòng)力節(jié)點(diǎn)Java官網(wǎng)。

提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 中文字幕日韩专区精品系列 | 就要操就要射 | 国产精品麻豆a啊在线观看 国产精品麻豆高清在线观看 | 亚洲激情综合在线 | 26uuu欧美日本 | 日韩a级毛片免费视频 | 天天爽夜夜爽人人爽 | 曰本一区二区三区 | 亚洲成人福利网站 | 精品国产夜色在线 | 久操视频在线观看 | 91精品一区二区三区在线观看 | 免费精品一区二区三区第35 | 中国xxnxx免费| 亚洲一欧洲中文字幕在线 | 涩涩视频www在线观看入口 | 99视频在线国产 | 成人a免费视频播放 | 亚洲激情 | 狠狠干天天爱 | free日韩性公交车上xxhd | 综合亚洲色图 | 操久久 | 在线免费观看视频黄 | 日本午夜影视 | 国产成人精选免费视频 | 天天天干 | 黄色一级免费 | 亚洲精品免费在线视频 | 欧美性xxxx偷拍 | 涩涩色视频在线播放 | 白丝国产 | 国产精品成人观看视频国产奇米 | 日韩欧美动漫 | 日韩毛片在线看 | 亚洲国产日韩欧美在线as乱码 | 主播蜜汁丝袜 精品自拍 | 在线中文字幕视频 | 小处雏一区二区三区精 | 国产黄色一级 | 黄色特级毛片 |