大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

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

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

更新時間:2022-12-27 10:30:15 來源:動力節(jié)點 瀏覽1244次

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

線程池面試題

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

如果我們在方法中直接new一個線程來處理,當(dāng)這個方法被調(diào)用頻繁時就會創(chuàng)建很多線程,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性。

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

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

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

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

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

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

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

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

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

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

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

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

//線程池實現(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)新建?個線程,并將任務(wù)(command)
			//添加到該線程中;然后,啟動該線程從?執(zhí)?任務(wù)。
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        //2.如果當(dāng)前執(zhí)行的任務(wù)數(shù)量?于等于 corePoolSize 的時候就會?到這
        // 通過 isRunning ?法判斷線程池狀態(tài),線程池處于 RUNNING 狀態(tài)才會被阻塞隊列加?任務(wù),該任務(wù)才會被加?進(jìn)去
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            
            // 再次獲取線程池狀態(tài),如果線程池狀態(tài)不是 RUNNING 狀態(tài)就需要從任務(wù)隊列中移除任務(wù),并嘗試判斷線程是否全部執(zhí)?完畢。同時執(zhí)?拒絕策略。
            if (! isRunning(recheck) && remove(command))
                reject(command);
            // 如果當(dāng)前線程池為空就新創(chuàng)建?個線程并執(zhí)?
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        
        //3. 通過addWorker(command, false)新建?個線程,
        	//并將任務(wù)(command)添加到該線程中;然后,啟動該線程從?執(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,工作隊列使用無界的LinkedBlockingQueue。適用于為了滿足資源管理的需求,而需要限制當(dāng)前線程數(shù)量的場景,適用于負(fù)載比較重的服務(wù)器。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 成人中文字幕一区二区三区 | 日韩一区二区三区在线 | 奇米网第四色 | www亚洲视频 | 女人十八毛片免费特黄 | 爱爱视频天天看 | 拍拍拍精品视频在线观看 | 一级毛片牲交大片 | 国产精品欧美久久久久天天影视 | 免费毛片a线观看 | 久精品视频 | 一级看片免费视频 | 亚洲香蕉国产高清在线播放 | 久久精品入口麻豆 | 亚洲图区欧美 | 一级黄色网 | 亚洲天天做夜夜做天天欢人人 | 久久精品一区二区三区不卡 | 欧美一级黄色片在线观看 | 天天躁狠狠躁夜躁2021 | 99热这里只有免费国产精品 | 不卡无毒免费毛片视频观看 | 99久久综合 | 四虎成人免费影院网址 | 中文字幕一级毛片视频 | 婷婷综合激情五月中文字幕 | 国产精品久久久久久五月尺 | 九九精品视频一区在线 | 宅男在线看片 | 国产精品亚洲欧美日韩一区在线 | 99免费在线播放99久久免费 | xxxxxx国产精品视频 | 一级特黄性色生活片一区二区 | 97精品高清一区二区三区 | 亚洲加勒比久久88色综合1 | 色九月| 国产h视频免费观看 | 久久高清一级毛片 | 4虎最新网址 | 手机看片福利 | 欧美日韩国产高清一区二区三区 |