最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java線程池中線程數(shù)量到底是幾

 更新時(shí)間:2022年08月01日 11:21:42   作者:Java個(gè)體戶  
本文主要介紹了java線程池中線程數(shù)量到底是幾,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

線程池配置

線程池配置,假設(shè)是:

1.最小數(shù)量是5

2.阻塞隊(duì)列容量是10

3.最大數(shù)量是20

線程池里的業(yè)務(wù)線程數(shù)量小于最小數(shù)量(5)

第一個(gè)請(qǐng)求

第一個(gè)請(qǐng)求進(jìn)來的時(shí)候,這個(gè)時(shí)候,線程池沒有線程,就創(chuàng)建新的工作線程(即Worker線程)。

然后,這個(gè)工作線程去處理當(dāng)前請(qǐng)求的業(yè)務(wù)線程。

第二個(gè)請(qǐng)求

第二個(gè)請(qǐng)求進(jìn)來的時(shí)候,這個(gè)時(shí)候,線程池已經(jīng)有了一個(gè)工作線程。

但是,要注意,這個(gè)時(shí)候是不會(huì)復(fù)用線程池里已有的工作線程的。而是創(chuàng)建新的工作線程。

因?yàn)?,線程池里根本沒有復(fù)用線程的概念。

說白了,無論線程池里已有的這個(gè)工作線程是否在處理業(yè)務(wù)線程,即不管它空閑與否,其實(shí)都會(huì)創(chuàng)建新的工作線程。

第三個(gè)請(qǐng)求

同上,仍然創(chuàng)建新的工作線程。

。。。

第五個(gè)請(qǐng)求

同上。仍然創(chuàng)建新的工作線程。

注意,現(xiàn)在,線程池有幾個(gè)工作線程?5個(gè)。

即,每個(gè)請(qǐng)求進(jìn)來,都創(chuàng)建一個(gè)新的工作線程。

小于阻塞隊(duì)列容量(10)

第六個(gè)請(qǐng)求

第六個(gè)請(qǐng)求進(jìn)來的時(shí)候,提交到阻塞隊(duì)列。

然后,再慢慢消費(fèi)。

具體來說,是由線程池里的工作線程來慢慢消費(fèi)。

具體消費(fèi)的源碼,參考:復(fù)用線程小節(jié)。

第七個(gè)請(qǐng)求

同上,也是先添加到阻塞隊(duì)列。

。。。

第15個(gè)請(qǐng)求

同上,也是先添加到阻塞隊(duì)列。

小于最大數(shù)量(20)

第16個(gè)請(qǐng)求

先來看,正常情況下,阻塞隊(duì)列還沒塞滿(生產(chǎn)環(huán)境的容量一般是1000),就會(huì)被快速處理掉。

然后,當(dāng)新的請(qǐng)求進(jìn)來的時(shí)候,繼續(xù)丟到阻塞隊(duì)列里面去。

這個(gè)是和上面講的一樣。

但是,我們?yōu)榱朔奖憷斫?,現(xiàn)在假設(shè)之前的15個(gè)請(qǐng)求是同時(shí)到達(dá),即

  • 前面5個(gè)請(qǐng)求

創(chuàng)建5個(gè)新的請(qǐng)求。

  • 后面10個(gè)請(qǐng)求

全部丟到阻塞隊(duì)列。

這個(gè)時(shí)候,阻塞隊(duì)列已經(jīng)滿了。接著,第16個(gè)請(qǐng)求進(jìn)來了,怎么辦?

繼續(xù)創(chuàng)建新的工作線程。

。。。

第35個(gè)請(qǐng)求

同上,繼續(xù)創(chuàng)建新的工作線程。

注意,這個(gè)時(shí)候,線程池里的工作線程的數(shù)量是多少?20。

因?yàn)?/p>

  • 前面5個(gè)請(qǐng)求,創(chuàng)建了5個(gè)新的工作線程。
  • 最后面的15個(gè)請(qǐng)求(第16到第35),創(chuàng)建了15個(gè)新的工作線程。

所以,總共,創(chuàng)建了20個(gè)新的工作線程。線程池,總共有20個(gè)工作線程。

拒絕策略

第36個(gè)請(qǐng)求

假設(shè)前面的請(qǐng)求都沒有處理完,這個(gè)時(shí)候,來了第36個(gè)請(qǐng)求,怎么辦?

只能采取拒絕策略。

具體采用哪個(gè)拒絕策略?比如說,一般情況下,都是采用丟棄。

復(fù)用線程

前面說了,線程池里沒有復(fù)用線程的概念。

那到底是怎么回事呢?既然不能復(fù)用線程,那搞個(gè)線程池有個(gè)幾把用?

具體是這樣子,雖然,線程池里的工作線程不能被復(fù)用,僅僅是指類似數(shù)據(jù)庫連接池里的連接的那種復(fù)用,即

  • 用的時(shí)候,從連接池取
  • 用完了,歸還到連接池

線程池里的對(duì)象復(fù)用,是基于循環(huán),而不是用完之后再還回去。

什么意思呢?就是工作線程,不斷的從阻塞隊(duì)列里取業(yè)務(wù)線程,然后執(zhí)行業(yè)務(wù)線程。

偽代碼

工作線程{
  run(){
    while(){
      1.從阻塞隊(duì)列,取業(yè)務(wù)線程
      2.執(zhí)行業(yè)務(wù)線程;
    }
  }
}

所以,線程池和連接池的區(qū)別在于,線程池的對(duì)象是線程,可以不斷的循環(huán)讀業(yè)務(wù)線程。而連接池的對(duì)象,是用完了歸還到連接池里去。

jdk源碼-java.util.concurrent.ThreadPoolExecutor#runWorker

/**
     * 核心步驟
     * 1.從阻塞隊(duì)列,讀業(yè)務(wù)線程
     * 2.執(zhí)行業(yè)務(wù)線程
     * 
     * ---
     * Main worker run loop.  Repeatedly gets tasks from queue and
     * executes them, while coping with a number of issues:
     *
     * 1. We may start out with an initial task, in which case we
     * don't need to get the first one. Otherwise, as long as pool is
     * running, we get tasks from getTask. If it returns null then the
     * worker exits due to changed pool state or configuration
     * parameters.  Other exits result from exception throws in
     * external code, in which case completedAbruptly holds, which
     * usually leads processWorkerExit to replace this thread.
     *
     * 2. Before running any task, the lock is acquired to prevent
     * other pool interrupts while the task is executing, and then we
     * ensure that unless pool is stopping, this thread does not have
     * its interrupt set.
     *
     * 3. Each task run is preceded by a call to beforeExecute, which
     * might throw an exception, in which case we cause thread to die
     * (breaking loop with completedAbruptly true) without processing
     * the task.
     *
     * 4. Assuming beforeExecute completes normally, we run the task,
     * gathering any of its thrown exceptions to send to afterExecute.
     * We separately handle RuntimeException, Error (both of which the
     * specs guarantee that we trap) and arbitrary Throwables.
     * Because we cannot rethrow Throwables within Runnable.run, we
     * wrap them within Errors on the way out (to the thread's
     * UncaughtExceptionHandler).  Any thrown exception also
     * conservatively causes thread to die.
     *
     * 5. After task.run completes, we call afterExecute, which may
     * also throw an exception, which will also cause thread to
     * die. According to JLS Sec 14.20, this exception is the one that
     * will be in effect even if task.run throws.
     *
     * The net effect of the exception mechanics is that afterExecute
     * and the thread's UncaughtExceptionHandler have as accurate
     * information as we can provide about any problems encountered by
     * user code.
     *
     * @param w the worker
     */
    final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            //從阻塞隊(duì)列里獲取業(yè)務(wù)線程
            while (task != null || (task = getTask()) != null) {
                w.lock();
                // If pool is stopping, ensure thread is interrupted;
                // if not, ensure thread is not interrupted.  This
                // requires a recheck in second case to deal with
                // shutdownNow race while clearing interrupt
                if ((runStateAtLeast(ctl.get(), STOP) ||
                     (Thread.interrupted() &&
                      runStateAtLeast(ctl.get(), STOP))) &&
                    !wt.isInterrupted())
                    wt.interrupt();
                try {
                    beforeExecute(wt, task);
                    Throwable thrown = null;
                    try {
                        //執(zhí)行業(yè)務(wù)線程
                        task.run();
                    } catch (RuntimeException x) {
                        thrown = x; throw x;
                    } catch (Error x) {
                        thrown = x; throw x;
                    } catch (Throwable x) {
                        thrown = x; throw new Error(x);
                    } finally {
                        afterExecute(task, thrown);
                    }
                } finally {
                    task = null;
                    w.completedTasks++;
                    w.unlock();
                }
            }
            completedAbruptly = false;
        } finally {
            processWorkerExit(w, completedAbruptly);
        }
    }

到此這篇關(guān)于java線程池中線程數(shù)量到底是幾的文章就介紹到這了,更多相關(guān)java 線程數(shù)量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java Zookeeper簡(jiǎn)述

    java Zookeeper簡(jiǎn)述

    ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。下面通過本文給大家分享java 中 zookeeper簡(jiǎn)單使用,需要的朋友參考下吧
    2021-09-09
  • Spring Cloud出現(xiàn)Options Forbidden 403問題解決方法

    Spring Cloud出現(xiàn)Options Forbidden 403問題解決方法

    本篇文章主要介紹了Spring Cloud出現(xiàn)Options Forbidden 403問題解決方法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-11-11
  • Java調(diào)用Python代碼的幾種方法小結(jié)

    Java調(diào)用Python代碼的幾種方法小結(jié)

    Python語言有豐富的系統(tǒng)管理、數(shù)據(jù)處理、統(tǒng)計(jì)類軟件包,因此從java應(yīng)用中調(diào)用Python代碼的需求很常見、實(shí)用,本文介紹幾種方法從java調(diào)用Python代碼,從而最大化利用兩個(gè)語言的優(yōu)勢(shì),需要的朋友可以參考下
    2025-01-01
  • Java?@Transactional指定回滾條件

    Java?@Transactional指定回滾條件

    這篇文章主要介紹了Java?@Transactional指定回滾條件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • Spring Shell打Jar包時(shí)常用小技巧

    Spring Shell打Jar包時(shí)常用小技巧

    這篇文章主要介紹了Spring Shell打Jar包時(shí)常用小技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot實(shí)現(xiàn)服務(wù)接入nacos注冊(cè)中心流程詳解

    SpringBoot實(shí)現(xiàn)服務(wù)接入nacos注冊(cè)中心流程詳解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)服務(wù)接入nacos注冊(cè)中心流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Java中的snowflake算法詳解

    Java中的snowflake算法詳解

    這篇文章主要介紹了Java中的snowflake算法詳解,Snowflake算法產(chǎn)生是為了滿足Twitter每秒上萬條消息的請(qǐng)求,每條消息都必須分配一條唯一的id,這些id還需要一些大致的順序,并且在分布式系統(tǒng)中不同機(jī)器產(chǎn)生的id必須不同,需要的朋友可以參考下
    2023-08-08
  • 解決無法解析javax.servlet的方法

    解決無法解析javax.servlet的方法

    最近在創(chuàng)建一個(gè)servlet時(shí),自動(dòng)生成的代碼中出現(xiàn)servlet無法解析的提示,令我無法正常使用servlet里的方法,在對(duì)各個(gè)步驟進(jìn)行查看后,發(fā)現(xiàn)了問題所在,需要的朋友可以參考下
    2021-05-05
  • SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析

    SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析

    這篇文章主要介紹了SpringBoot基于數(shù)據(jù)庫實(shí)現(xiàn)定時(shí)任務(wù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式詳解

    Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式詳解

    Spring的@Scheduled注解是一種非常簡(jiǎn)單和便捷的實(shí)現(xiàn)定時(shí)任務(wù)的方式,通過在方法上添加@Scheduled注解,我們可以指定方法在特定的時(shí)間間隔或固定的時(shí)間點(diǎn)執(zhí)行,本文給大家介紹Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式,感興趣的的朋友一起看看b
    2024-02-02

最新評(píng)論

泸定县| 和龙市| 南江县| 成都市| 丽水市| 左贡县| 新绛县| 旅游| 黔南| 宁波市| 婺源县| 上思县| 荥经县| 阿尔山市| 报价| 平湖市| 康马县| 闻喜县| 兴城市| 宁阳县| 嘉黎县| 东乌珠穆沁旗| 廉江市| 德江县| 塔城市| 无为县| 重庆市| 兴山县| 九龙坡区| 贵港市| 霍山县| 鸡东县| 大化| 红河县| 广平县| 大渡口区| 东海县| 慈利县| 枣强县| 英山县| 贵德县|