国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java Java面試題 java面試之線程池

java面試之線程池

Dec 17, 2020 am 10:12 AM
java 執(zhí)行緒池 面試

java面試之線程池

以下是我整理的一些java面試中常見的線程池問題,現(xiàn)在分享給大家。

(學(xué)習(xí)影片分享:java教學(xué)影片

什麼是執(zhí)行緒池?

執(zhí)行緒池是一種多執(zhí)行緒處理形式,處理過程中將任務(wù)提交到執(zhí)行緒池,任務(wù)的執(zhí)行交由執(zhí)行緒池來管理。

如果每個(gè)請(qǐng)求都建立一個(gè)執(zhí)行緒去處理,那麼伺服器的資源很快就會(huì)被耗盡,使用執(zhí)行緒池可以減少建立和銷毀執(zhí)行緒的次數(shù),每個(gè)工作執(zhí)行緒都可以被重複利用,可執(zhí)行多個(gè)任務(wù)。

為什麼要使用執(zhí)行緒池?

建立執(zhí)行緒和銷毀執(zhí)行緒的花銷是比較大的,這些時(shí)間有可能比處理業(yè)務(wù)的時(shí)間還要長(zhǎng)。這樣頻繁的創(chuàng)建線程和銷毀線程,再加上業(yè)務(wù)工作線程,消耗系統(tǒng)資源的時(shí)間,可能導(dǎo)致系統(tǒng)資源不足。 (我們可以把創(chuàng)建和銷毀的線程的過程去掉)

線程池有什麼作用?

執(zhí)行緒池作用就是限制系統(tǒng)中執(zhí)行緒的數(shù)量。

1、提高效率 創(chuàng)建好一定數(shù)量的執(zhí)行緒放在池中,等需要使用的時(shí)候就從池中拿一個(gè),這要比需要的時(shí)候創(chuàng)建一個(gè)線程物件要快的多。

2、方便管理可以編寫線程池管理程式碼對(duì)池中的線程同一進(jìn)行管理,比如說啟動(dòng)時(shí)有該程式創(chuàng)建100個(gè)線程,每當(dāng)有請(qǐng)求的時(shí)候,就分配一個(gè)線程去工作,如果剛好並發(fā)有101個(gè)請(qǐng)求,那多出的這一個(gè)請(qǐng)求可以排隊(duì)等候,避免因無休止的創(chuàng)建線程導(dǎo)致系統(tǒng)崩潰。

說說幾個(gè)常見的執(zhí)行緒池及使用場(chǎng)景

1、newSingleThreadExecutor

建立一個(gè)單執(zhí)行緒化的執(zhí)行緒池,它只會(huì)用唯一的工作執(zhí)行緒來執(zhí)行任務(wù),保證所有任務(wù)依照指定順序(FIFO, LIFO, 優(yōu)先權(quán))執(zhí)行。

2、newFixedThreadPool

建立一個(gè)定長(zhǎng)執(zhí)行緒池,可控制執(zhí)行緒最大並發(fā)數(shù),超出的執(zhí)行緒會(huì)在佇列中等待。

3、newCachedThreadPool

建立一個(gè)可快取線程池,如果線程池長(zhǎng)度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。

4、newScheduledThreadPool

建立一個(gè)定長(zhǎng)執(zhí)行緒池,支援定時(shí)及週期性任務(wù)執(zhí)行。

線程池中的幾個(gè)重要的參數(shù)

corePoolSize就是線程池中的核心線程數(shù)量,這幾個(gè)核心線程,只是在沒有用的時(shí)候,也不會(huì)被回收

maximumPoolSize就是在執(zhí)行緒池中可以容納的最大執(zhí)行緒的數(shù)量

keepAliveTime,就是在執(zhí)行緒池中除了核心執(zhí)行緒之外的其他的最長(zhǎng)可以保留的時(shí)間,因?yàn)樵趫?zhí)行緒池中,除了核心執(zhí)行緒即使在無任務(wù)的情況下也不能被清除,其餘的都是有存活時(shí)間的,意思就是非核心執(zhí)行緒可以保留的最長(zhǎng)的空閒時(shí)間

util,就是計(jì)算這個(gè)時(shí)間的一個(gè)單位。

workQueue,就是等待佇列,任務(wù)可以儲(chǔ)存在任務(wù)佇列中等待被執(zhí)行,執(zhí)行的是FIFIO原則(先進(jìn)先出)。

(更多相關(guān)面試題分享:java面試題目及答案

threadFactory,就是建立執(zhí)行緒的執(zhí)行緒工廠。

handler,是一種拒絕策略,我們可以在任務(wù)滿了之後,拒絕執(zhí)行某些任務(wù)。

說說線程池的拒絕策略

當(dāng)請(qǐng)求任務(wù)不斷的過來,而係統(tǒng)此時(shí)又處理不過來的時(shí)候,我們需要採取的策略是拒絕服務(wù)。 RejectedExecutionHandler介面提供了拒絕任務(wù)處理的自訂方法的機(jī)會(huì)。在ThreadPoolExecutor中已經(jīng)包含四種處理策略。

AbortPolicy策略:此策略會(huì)直接拋出異常,阻止系統(tǒng)正常運(yùn)作。

CallerRunsPolicy 策略:只要執(zhí)行緒池未關(guān)閉,該策略直接在呼叫者執(zhí)行緒中,執(zhí)行目前的被丟棄的任務(wù)。

DiscardOleddestPolicy策略: 此策略將丟棄最老的一個(gè)請(qǐng)求,也就是即將被執(zhí)行的任務(wù),並嘗試再次提交目前任務(wù)。

DiscardPolicy策略:此策略默默的丟棄無法處理的任務(wù),不予任何處理。

除了JDK預(yù)設(shè)提供的四種拒絕策略,我們可以根據(jù)自己的業(yè)務(wù)需求去自訂拒絕策略,自訂的方式很簡(jiǎn)單,直接實(shí)作RejectedExecutionHandler介面即可。

execute和submit的差別?

在前面的講解中,我們執(zhí)行任務(wù)是用的execute方法,除了execute方法,還有一個(gè)submit方法也可以執(zhí)行我們提交的任務(wù)。

這兩個(gè)方法有什麼差別呢?分別適用於在什麼場(chǎng)景下呢?我們來做一個(gè)簡(jiǎn)單的分析。

execute適用於不需要關(guān)注回傳值的場(chǎng)景,只需要將執(zhí)行緒丟到執(zhí)行緒池中去執(zhí)行就可以了。

submit方法適用於需要關(guān)注傳回值的場(chǎng)景

五種執(zhí)行緒池的使用場(chǎng)景

newSingleThreadExecutor:一個(gè)單執(zhí)行緒的執(zhí)行緒池,可以用來保證順序執(zhí)行的場(chǎng)景,而且只有一個(gè)執(zhí)行緒在執(zhí)行。

newFixedThreadPool:一個(gè)固定大小的執(zhí)行緒池,可以用來已知並發(fā)壓力的情況下,對(duì)執(zhí)行緒數(shù)做限制。

newCachedThreadPool:一個(gè)可以無限擴(kuò)大的執(zhí)行緒池,比較適合處理執(zhí)行時(shí)間比較小的任務(wù)。

newScheduledThreadPool:可以延時(shí)啟動(dòng),定時(shí)啟動(dòng)的執(zhí)行緒池,適用於需要多個(gè)後臺(tái)執(zhí)行緒執(zhí)行週期任務(wù)的場(chǎng)景。

newWorkStealingPool:一個(gè)擁有多個(gè)任務(wù)佇列的執(zhí)行緒池,可以減少連線數(shù),並建立目前可用cpu數(shù)量的執(zhí)行緒來並行執(zhí)行。

執(zhí)行緒池的關(guān)閉

關(guān)閉執(zhí)行緒池可以呼叫shutdownNow和shutdown兩個(gè)方法來實(shí)現(xiàn)

shutdownNow:對(duì)正在執(zhí)行的任務(wù)全部發(fā)出interrupt(),停止執(zhí)行,對(duì)尚未開始執(zhí)行的任務(wù)全部取消,並且傳回還沒開始的任務(wù)清單。

shutdown:當(dāng)我們呼叫shutdown後,執(zhí)行緒池將不再接受新的任務(wù),但也不會(huì)去強(qiáng)制終止已經(jīng)提交或正在執(zhí)行中的任務(wù)。

初始化執(zhí)行緒池時(shí)執(zhí)行緒數(shù)的選擇

如果任務(wù)是IO密集型,一般執(zhí)行緒數(shù)需要設(shè)定2倍CPU數(shù)以上,以此來盡量利用CPU資源。

如果任務(wù)是CPU密集型,一般執(zhí)行緒數(shù)只需要設(shè)定CPU數(shù)加1即可,更多的執(zhí)行緒數(shù)也只能增加上下文切換,不能增加CPU利用率。

上述只是一個(gè)基本思想,如果真的需要精確的控制,還是需要上線以後觀察線程池中線程數(shù)量跟隊(duì)列的情況來定。

執(zhí)行緒池都有哪幾個(gè)工作佇列

1、ArrayBlockingQueue

是一個(gè)基於陣列結(jié)構(gòu)的有界阻塞佇列,此佇列依FIFO(進(jìn)階先出)原則對(duì)元素進(jìn)行排序。

2、LinkedBlockingQueue

一個(gè)基於鍊錶結(jié)構(gòu)的阻塞佇列,此佇列依FIFO (先進(jìn)先出) 排序元素,吞吐量通常要高於ArrayBlockingQueue。靜態(tài)工廠方法Executors.newFixedThreadPool()使用了這個(gè)佇列

3、SynchronousQueue

一個(gè)不儲(chǔ)存元素的阻塞佇列。每個(gè)插入操作必須等到另一個(gè)執(zhí)行緒呼叫移除操作,否則插入操作一直處於阻塞狀態(tài),吞吐量通常要高於LinkedBlockingQueue,靜態(tài)工廠方法Executors.newCachedThreadPool使用了這個(gè)佇列。

4、PriorityBlockingQueue

一個(gè)具有優(yōu)先權(quán)的無限阻塞佇列。

相關(guān)課程推薦:java入門教學(xué)

以上是java面試之線程池的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險(xiǎn)。 1.GC從根對(duì)象(如棧變量、活動(dòng)線程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無法到達(dá)的對(duì)像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按後進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

See all articles