亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 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í)行緒池來管理。

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

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

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

線程池有什麼作用?

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

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

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

說說幾個常見的執(zhí)行緒池及使用場景

1、newSingleThreadExecutor

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

2、newFixedThreadPool

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

3、newCachedThreadPool

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

4、newScheduledThreadPool

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

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

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

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

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

util,就是計算這個時間的一個單位。

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

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

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

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

說說線程池的拒絕策略

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

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

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

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

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

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

execute和submit的差別?

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

這兩個方法有什麼差別呢?分別適用於在什麼場景下呢?我們來做一個簡單的分析。

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

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

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

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

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

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

newScheduledThreadPool:可以延時啟動,定時啟動的執(zhí)行緒池,適用於需要多個後臺執(zhí)行緒執(zhí)行週期任務(wù)的場景。

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

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

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

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

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

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

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

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

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

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

1、ArrayBlockingQueue

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

2、LinkedBlockingQueue

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

3、SynchronousQueue

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

4、PriorityBlockingQueue

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

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設(shè)置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

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

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

了解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)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(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框架: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。

See all articles