日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中的線(xiàn)程池包括哪些

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-11 15:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

線(xiàn)程池是用來(lái)統(tǒng)一管理線(xiàn)程的,在 Java 中創(chuàng)建和銷(xiāo)毀線(xiàn)程都是一件消耗資源的事情,線(xiàn)程池可以重復(fù)使用線(xiàn)程,不再頻繁的創(chuàng)建、銷(xiāo)毀線(xiàn)程。

初識(shí)

Java 中的線(xiàn)程池是由 juc 即 java.util.concurrent 包來(lái)實(shí)現(xiàn)的,最主要的就是 ThreadPoolExecutor 類(lèi)。

圖片

  1. Executor: 代表線(xiàn)程池的接口,有一個(gè) execute() 方法,給一個(gè) Runnable 類(lèi)型對(duì)象就可以分配一個(gè)線(xiàn)程執(zhí)行。
  2. ExecutorService:是 Executor 的子接口,提供了線(xiàn)程池的一些生命周期方法。代表了一個(gè)線(xiàn)程池管理器。
  3. ThreadPoolExecutor:一個(gè)線(xiàn)程池的實(shí)現(xiàn)類(lèi),可以通過(guò)調(diào)用 Executors 靜態(tài)工廠(chǎng)方法來(lái)創(chuàng)建線(xiàn)程池并返回一個(gè) ExecutorService 對(duì)象。

ThredadPoolExcutor

看一下最常用的 ThredadPoolExcutor ,下圖是 ThreadPoolExecutor 的構(gòu)造函數(shù)

圖片

從源碼中可以看出每個(gè)前三個(gè)構(gòu)造函數(shù)都調(diào)用了最后一個(gè)構(gòu)造函數(shù)。

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue< Runnable > workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
    //省略代碼
    }

仔細(xì)分析一下構(gòu)造參數(shù):

  1. corePoolSize:線(xiàn)程池里的核心線(xiàn)程數(shù)量,當(dāng)正在運(yùn)行的線(xiàn)程數(shù)量小于核心線(xiàn)程數(shù)量,就創(chuàng)建一個(gè)核心線(xiàn)程。
  2. maximumPoolSize:線(xiàn)程池最多能放多少個(gè)線(xiàn)程。
  3. keepAliveTime:線(xiàn)程的閑置時(shí)間,當(dāng)線(xiàn)程池里面的線(xiàn)程數(shù)量大于 corePoolSize 的時(shí)候,多出來(lái)的線(xiàn)程在等待的時(shí)間之后會(huì)被釋放掉
  4. unit:keepAliveTime 的單位
  5. workQueue:一個(gè)阻塞隊(duì)列。
  6. threadFactory:通過(guò)這個(gè)工廠(chǎng)模式創(chuàng)建線(xiàn)程。
  7. handler:處理線(xiàn)程隊(duì)列滿(mǎn)了報(bào)錯(cuò)的。

結(jié)合線(xiàn)程池的參數(shù)簡(jiǎn)單的畫(huà)出線(xiàn)程池的工作模型。

圖片

當(dāng)線(xiàn)程池中的核心線(xiàn)程數(shù)量 corePoolSize 滿(mǎn)了,就會(huì)將任務(wù)先加入到任務(wù)隊(duì)列 workQueue 中。

執(zhí)行過(guò)程

線(xiàn)程池的執(zhí)行過(guò)程如下圖:

  1. 首先判斷核心線(xiàn)程 corePoolSize 是不是滿(mǎn)了,如果沒(méi)有滿(mǎn),就執(zhí)行任務(wù),否則就進(jìn)入下一步。
  2. 線(xiàn)程池判斷任務(wù)隊(duì)列 workQueue 是否了,如果沒(méi)有滿(mǎn),則將新提交的任務(wù)放入在這個(gè)任務(wù)隊(duì)列里。如果任務(wù)隊(duì)列滿(mǎn)了,則進(jìn)入一步。
  3. 判斷線(xiàn)程池里的線(xiàn)程達(dá)到了最大線(xiàn)程數(shù) maximumPoolSize,如果沒(méi)有,則創(chuàng)建一個(gè)新的線(xiàn)程來(lái)執(zhí)行任務(wù)。如果已經(jīng)滿(mǎn)了,則交給拒絕策略來(lái)處理這個(gè)任務(wù)。

圖片

常用的線(xiàn)程池

線(xiàn)程池的創(chuàng)建需要有 7 個(gè)參數(shù),還是比較復(fù)雜的,JVM 為我們提供了 Executors 類(lèi)中多個(gè)靜態(tài)工廠(chǎng),生成一些常用的線(xiàn)程池。

SingleThreadExecutor

單線(xiàn)程的線(xiàn)程池,里面就一個(gè)核心線(xiàn)程數(shù)。

public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue< Runnable >()));
}

ThreadPoolExecutor 參數(shù)只有一個(gè)核心線(xiàn)程數(shù)和一個(gè)最大線(xiàn)程數(shù),這個(gè)很少用到。它保證了所有線(xiàn)程的執(zhí)行順序都是按照提交到線(xiàn)程池的順序執(zhí)行。

public class TodoDemo implements Runnable {


    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        for(int i = 0; i < 10; i++) {
            executorService.execute(new TodoDemo());
        }
        executorService.shutdown();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " Running");
    }
}

只有一個(gè)線(xiàn)程在跑。

圖片

FixedThreadExecutor

固定數(shù)量的線(xiàn)程池

return new ThreadPoolExecutor(nThreads, nThreads,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue< Runnable >());
}

這個(gè)線(xiàn)程池的特點(diǎn)就是線(xiàn)程的數(shù)量是固定的,超過(guò)這個(gè)數(shù)量的任務(wù)就得在 LinkedBlockingQueue 中排隊(duì)等候。

public class TodoDemo implements Runnable {
    
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for(int i = 0; i < 10; i++) {
            executorService.execute(new TodoDemo());
        }
        executorService.shutdown();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " Running");
    }
}

可以看到就算提交 100 個(gè)任務(wù)也只有 3 個(gè)線(xiàn)程。

圖片

CachedThreadExecutor

自動(dòng)回收空閑的線(xiàn)程

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                    60L, TimeUnit.SECONDS,
                                    new SynchronousQueue< Runnable >());
}

可以看到核心線(xiàn)程數(shù)量為 0, 表示不會(huì)永久保留任何的線(xiàn)程,最大線(xiàn)程的數(shù)量是 Integer.MAX_VALUE,可以無(wú)限制的創(chuàng)建線(xiàn)程,但是當(dāng)有大量線(xiàn)程處于空閑狀態(tài)的時(shí)候,超過(guò) 60s 就會(huì)被銷(xiāo)毀。

public class TodoDemo implements Runnable {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for(int i = 0; i < 20; i++) {
            executorService.execute(new TodoDemo());
        }
        executorService.shutdown();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " Running");
    }
}

雖然這個(gè)線(xiàn)程池可以想建多少個(gè)線(xiàn)程就建多少個(gè)線(xiàn)程,但是還是會(huì)重用已經(jīng)完成任務(wù)的線(xiàn)程。

圖片

一般最常用的是FixedThreadExecutor和CachedThreadExecutor。

線(xiàn)程池的回收策略

在線(xiàn)程池中任務(wù)隊(duì)列已經(jīng)滿(mǎn)了,并且線(xiàn)程的數(shù)量已經(jīng)到了最大的數(shù)量,這個(gè)時(shí)候再加任務(wù)線(xiàn)程池就不再接受了。

在 ThreadPoolExecutor 里有 4 種拒絕策略,都實(shí)現(xiàn)了 RejectedExecutionHandler:

  1. AbortPolicy 表示拋出一個(gè)異常。
  2. DiscardPolicy 拒絕任務(wù)但是不提示。
  3. DiscardOldestPolicy 丟棄掉老的任務(wù),執(zhí)行新的任務(wù)。
  4. CallerRunsPolicy 直接調(diào)用線(xiàn)程處理。

總結(jié)

線(xiàn)程池的作用是提高系統(tǒng)的性能和線(xiàn)程的利用率,不再需要頻繁的創(chuàng)建和銷(xiāo)毀線(xiàn)程。如果使用最簡(jiǎn)單的方式創(chuàng)建線(xiàn)程,在用戶(hù)量巨大的情況下,消耗的性能是非常恐怖的,所以才有了線(xiàn)程池。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9603

    瀏覽量

    157673
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116873
  • 管理器
    +關(guān)注

    關(guān)注

    0

    文章

    265

    瀏覽量

    19558
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67869
  • 線(xiàn)程池
    +關(guān)注

    關(guān)注

    0

    文章

    58

    瀏覽量

    7428
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Java線(xiàn)程的用法

    本文將介紹一下Java線(xiàn)程的用法。 基礎(chǔ)介紹 什么是多線(xiàn)程 指的是在一個(gè)進(jìn)程同時(shí)運(yùn)行多個(gè)線(xiàn)程,每個(gè)線(xiàn)
    的頭像 發(fā)表于 09-30 17:07 ?2129次閱讀

    動(dòng)態(tài)線(xiàn)程思想學(xué)習(xí)及實(shí)踐

    ://www.javadoop.com/post/java-thread-pool? 引言 在后臺(tái)項(xiàng)目開(kāi)發(fā)過(guò)程,我們常常借助線(xiàn)程來(lái)實(shí)現(xiàn)多線(xiàn)程
    的頭像 發(fā)表于 06-13 15:43 ?2144次閱讀
    動(dòng)態(tài)<b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>思想學(xué)習(xí)及實(shí)踐

    線(xiàn)程是如何實(shí)現(xiàn)的

    線(xiàn)程的概念是什么?線(xiàn)程是如何實(shí)現(xiàn)的?
    發(fā)表于 02-28 06:20

    java自帶的線(xiàn)程方法

    二、原理分析 從上面使用線(xiàn)程的例子來(lái)看,最主要就是兩步,構(gòu)造ThreadPoolExecutor對(duì)象,然后每來(lái)一個(gè)任務(wù),就調(diào)用ThreadPoolExecutor對(duì)象的execute方法。 1
    發(fā)表于 09-27 11:06 ?0次下載

    如何正確關(guān)閉線(xiàn)程

    /huajiexiewenfeng/java-concurrent 本章模塊:threadpool 1.線(xiàn)程示例 public class ShutDownThreadPoolDemo { private
    的頭像 發(fā)表于 09-29 14:41 ?1.1w次閱讀

    線(xiàn)程線(xiàn)程

    線(xiàn)程通常用于服務(wù)器應(yīng)用程序。 每個(gè)傳入請(qǐng)求都將分配給線(xiàn)程池中的一個(gè)線(xiàn)程,因此可以異步處理請(qǐng)求,而不會(huì)占用主線(xiàn)程,也不會(huì)延遲后續(xù)請(qǐng)求的處理
    的頭像 發(fā)表于 02-28 09:53 ?1805次閱讀
    多<b class='flag-5'>線(xiàn)程</b>之<b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>

    Java線(xiàn)程核心原理

    看過(guò)Java線(xiàn)程源碼的小伙伴都知道,在Java線(xiàn)程池中最核心的類(lèi)就是ThreadPoolExecutor,
    的頭像 發(fā)表于 04-21 10:24 ?1722次閱讀

    Spring 的線(xiàn)程應(yīng)用

    我們?cè)谌粘i_(kāi)發(fā),經(jīng)常跟多線(xiàn)程打交道,Spring 為我們提供了一個(gè)線(xiàn)程方便我們開(kāi)發(fā),它就是 ThreadPoolTaskExecutor ,接下來(lái)我們就來(lái)聊聊 Spring 的
    的頭像 發(fā)表于 10-13 10:47 ?1551次閱讀
    Spring 的<b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>應(yīng)用

    如何設(shè)計(jì)一個(gè)線(xiàn)程JAVA線(xiàn)程是如何設(shè)計(jì)的?

    線(xiàn)程(thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程的實(shí)際 運(yùn)作單位。
    的頭像 發(fā)表于 11-07 09:12 ?2517次閱讀
    如何設(shè)計(jì)一個(gè)<b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>?<b class='flag-5'>JAVA</b><b class='flag-5'>中</b>的<b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>是如何設(shè)計(jì)的?

    線(xiàn)程基本概念與原理

    一、線(xiàn)程基本概念與原理 1.1 線(xiàn)程概念及優(yōu)勢(shì) C++線(xiàn)程簡(jiǎn)介
    的頭像 發(fā)表于 11-10 10:24 ?1726次閱讀

    線(xiàn)程的基本概念

    ? 呃呃,我這么問(wèn)就很奇怪,因?yàn)?b class='flag-5'>線(xiàn)程是什么我都沒(méi)說(shuō),怎么會(huì)知道為什么會(huì)有線(xiàn)程呢?所以我打算帶大家去思考一個(gè)場(chǎng)景: 當(dāng)我們的程序:有一批
    的頭像 發(fā)表于 11-10 16:37 ?1257次閱讀
    <b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>的基本概念

    線(xiàn)程的運(yùn)轉(zhuǎn)流程圖 化技術(shù)實(shí)踐案例解析

    作為一名Java開(kāi)發(fā)人員,化技術(shù)或多或少在業(yè)務(wù)代碼中使用。常見(jiàn)的包括線(xiàn)程、連接等。也是因?yàn)?/div>
    的頭像 發(fā)表于 11-24 10:22 ?2705次閱讀
    <b class='flag-5'>線(xiàn)程</b><b class='flag-5'>池</b>的運(yùn)轉(zhuǎn)流程圖 <b class='flag-5'>池</b>化技術(shù)實(shí)踐案例解析

    線(xiàn)程的創(chuàng)建方式有幾種

    線(xiàn)程是一種用于管理和調(diào)度線(xiàn)程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過(guò)預(yù)先創(chuàng)建一組線(xiàn)程并維護(hù)一個(gè)工作隊(duì)列,將任務(wù)提交給線(xiàn)程
    的頭像 發(fā)表于 12-04 16:52 ?1854次閱讀

    什么是動(dòng)態(tài)線(xiàn)程?動(dòng)態(tài)線(xiàn)程的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線(xiàn)程一種針對(duì)以上痛點(diǎn)開(kāi)發(fā)的線(xiàn)程管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線(xiàn)程
    的頭像 發(fā)表于 02-28 10:42 ?1768次閱讀

    java實(shí)現(xiàn)多線(xiàn)程的幾種方式

    了多種實(shí)現(xiàn)多線(xiàn)程的方式,本文將詳細(xì)介紹以下幾種方式: 1.繼承Thread類(lèi) 2.實(shí)現(xiàn)Runnable接口 3.Callable和Future 4.線(xiàn)程 5.Java 8
    的頭像 發(fā)表于 03-14 16:55 ?2173次閱讀
    丰镇市| 双牌县| 汪清县| 安平县| 烟台市| 岑溪市| 中山市| 襄城县| 酉阳| 肥城市| 津南区| 湘阴县| 乌兰察布市| 日喀则市| 龙山县| 新余市| 久治县| 伊金霍洛旗| 永定县| 湘潭县| 德保县| 云安县| 六盘水市| 乌兰县| 大荔县| 什邡市| 凤山县| 赣州市| 彩票| 永靖县| 江安县| 临泉县| 临城县| 聂拉木县| 安陆市| 汾西县| 会东县| 井研县| 大竹县| 施秉县| 衡山县|