摘要:首先我們來了解下線程池的基本原理第一步便是我們將我們的任務(wù)提交給線程池如果線程池中線程數(shù)小于核心線程數(shù),則創(chuàng)建一個(gè)新的線程來執(zhí)行該任務(wù)。
Java開發(fā)的同學(xué)肯定使用過多線程,使用多線程那就肯定會(huì)用到線程池。而且個(gè)人認(rèn)為線程池也是各大互聯(lián)網(wǎng)公司在面試的時(shí)候必問的一個(gè)知識(shí)點(diǎn)。因此作為開發(fā)人員,必須了解線程池的原理以及具體參數(shù)的含義。
首先我們來了解下線程池的基本原理
第一步便是我們將我們的任務(wù)提交給線程池
如果線程池中線程數(shù)小于核心線程數(shù),則創(chuàng)建一個(gè)新的線程來執(zhí)行該任務(wù)。否則進(jìn)入步驟3
提交任務(wù)時(shí),線程池中的空閑的線程數(shù)為0并且線程數(shù)等于核心線程數(shù),則觀察線程池中的任務(wù)隊(duì)列是否已滿,如果未滿則將任務(wù)添加到任務(wù)隊(duì)列,否則進(jìn)入步驟4
如果最大線程數(shù)大于核心線程數(shù),并且總線程數(shù)小于最大線程數(shù),則創(chuàng)建一個(gè)新的線程來執(zhí)行該任務(wù)。否則進(jìn)入步驟5
當(dāng)任務(wù)隊(duì)列已滿時(shí),就執(zhí)行拒絕策略(后續(xù)詳解拒絕策略)
在大致了解了線程池的基本工作原理之后,我們再細(xì)看下線程池核心類ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { //省略具體的代碼內(nèi)容 }
參數(shù)說明
參數(shù) | 說明 |
---|---|
corePoolSize | 核心線程數(shù) |
maximumPoolSize | 最大線程數(shù),一般大于等于核心線程數(shù) |
keepAliveTime | 線程存活時(shí)間(針對(duì)最大線程數(shù)大于核心線程數(shù)時(shí),非核心線程) |
unit | 存活時(shí)間單位,和線程存活時(shí)間配套使用 |
workQueue | 任務(wù)隊(duì)列 |
threadFactory | 創(chuàng)建線程的工程 |
handler | 拒絕策略 |
拒絕策略有以下幾種
拒絕策略 | 說明 |
---|---|
AbortPolicy | 為java線程池默認(rèn)的阻塞策略,不執(zhí)行此任務(wù),而且直接拋出一個(gè)運(yùn)行時(shí)異常。 |
DiscardOldestPolicy | 丟棄隊(duì)列最前面的任務(wù),然后重新嘗試執(zhí)行任務(wù)(重復(fù)此過程) |
DiscardPolicy | 也是丟棄任務(wù),但是不拋出異常 |
CallerRunsPolicy | 由調(diào)度線程處理該任務(wù) |
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74674.html
摘要:當(dāng)活動(dòng)線程核心線程非核心線程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請(qǐng)求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:在前面介紹的文章中,提到了關(guān)于線程池的創(chuàng)建介紹,在文章之系列外部中第一部分有詳細(xì)的說明,請(qǐng)參閱文章中其實(shí)說明了外部的使用方式,但是沒有說內(nèi)部是如何實(shí)現(xiàn)的,為了加深對(duì)實(shí)現(xiàn)的理解,在使用中可以放心,我們這里將做源碼解析以及反饋到原理上,工具可 在前面介紹JUC的文章中,提到了關(guān)于線程池Execotors的創(chuàng)建介紹,在文章:《java之JUC系列-外部Tools》中第一部分有詳細(xì)的說明,請(qǐng)參...
摘要:中的線程池運(yùn)用場景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。代碼中如果執(zhí)行了方法,線程池會(huì)提前創(chuàng)建并啟動(dòng)所有核心線程。線程池最大數(shù)量線程池允許創(chuàng)建的線程最大數(shù)量。被稱為是可重用固定線程數(shù)的線程池。 Java中的線程池運(yùn)用場景非常廣泛,幾乎所有的一步或者并發(fā)執(zhí)行程序都可以使用。那么線程池有什么好處呢,以及他的實(shí)現(xiàn)原理是怎么樣的呢? 使用線程池的好處 在開發(fā)過程中,合理的使用線程...
摘要:數(shù)據(jù)結(jié)構(gòu)和算法樹快速排序,堆排序,插入排序其實(shí)八大排序算法都應(yīng)該了解一致性算法,一致性算法的應(yīng)用的內(nèi)存結(jié)構(gòu)。如何存儲(chǔ)一個(gè)的。八大排序算法一定要手敲一遍快排,堆排尤其重要。面試是一個(gè)雙向選擇的過程,不要抱著畏懼的心態(tài)去面試,不利于自己的發(fā)揮。 前言 16年畢業(yè)到現(xiàn)在也近兩年了,最近面試了阿里集團(tuán)(菜鳥網(wǎng)絡(luò),螞蟻金服),網(wǎng)易,滴滴,點(diǎn)我達(dá),最終收到點(diǎn)我達(dá),網(wǎng)易o(hù)ffer,螞蟻金服二面掛掉,...
摘要:類型是位二進(jìn)制標(biāo)示,其中高位用來表示線程池狀態(tài),后面位用來記錄線程池線程個(gè)數(shù)。創(chuàng)建一個(gè)最小線程個(gè)數(shù)為,最大為,阻塞隊(duì)列為的線程池。 一、 前言 線程池主要解決兩個(gè)問題:一方面當(dāng)執(zhí)行大量異步任務(wù)時(shí)候線程池能夠提供較好的性能,這是因?yàn)槭褂镁€程池可以使每個(gè)任務(wù)的調(diào)用開銷減少(因?yàn)榫€程池線程是可以復(fù)用的)。另一方面線程池提供了一種資源限制和管理的手段,比如當(dāng)執(zhí)行一系列任務(wù)時(shí)候?qū)€程的管理,每個(gè)...
閱讀 678·2023-04-25 18:59
閱讀 1216·2021-09-22 16:00
閱讀 1891·2021-09-22 15:42
閱讀 3598·2021-09-22 15:27
閱讀 1252·2019-08-30 15:54
閱讀 1108·2019-08-30 11:16
閱讀 2450·2019-08-29 16:24
閱讀 826·2019-08-29 12:14