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

java線程池核心線程不被摧毀的原理及分析

 更新時間:2025年05月07日 11:18:04   作者:春風十里不及你  
這篇文章主要介紹了java線程池核心線程不被摧毀的原理及分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

為什么要用線程池?

  • 減少了創(chuàng)建和銷毀線程的次數,每個工作線程都可以被重復利用
  • 可以根據系統(tǒng)的承受能力,調整線程池中工作線線程的數目,防止因線程過多消耗內存,也避免了因線程過少,浪費系統(tǒng)資源

如何做到每個工作線程都可以被重復利用呢?

先看下線程池的工作原理:

原理如上圖,線程池有七個核心參數

  • corePoolSize 線程池核心線程數
  • maximumPoolSize 線程池最大線程數量
  • keepAliveTime 空閑線程存活時間
  • unit 空閑線程存活時間單位
  • workQueue 工作隊列
  • threadFactory 線程工廠
  • handler 拒絕策略

線程池之所以能做到重復利用,是因為線程池的核心線程不會被摧毀,執(zhí)行完任務后會重復利用

線程池是如何保持核心線程不被摧毀呢?

首先看先線程池是如何處理任務的,如下圖

下面我們看下核心部分源碼:

  • 當有一個任務添加進來時,線程池會創(chuàng)建一個Worker,Worker是實現Runnable方法的,所以Worker執(zhí)行時會調用run方法,run方法會接著調用runWoker方法
  • 主要看這一行代碼,調用getTask方法獲取任務并且執(zhí)行 while (task != null || (task = getTask()) != null)
final void runWorker(Worker w) {
        Thread wt = Thread.currentThread();
        Runnable task = w.firstTask;
        w.firstTask = null;
        w.unlock(); // allow interrupts
        boolean completedAbruptly = true;
        try {
            // 主要看這一行代碼,調用getTask方法獲取任務并且執(zhí)行
            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 {
                        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);
        }
    }
  • 看下getTask方法是如何實現的
private Runnable getTask() {
        boolean timedOut = false; // Did the last poll() time out?

        for (;;) {
            int c = ctl.get();
            int rs = runStateOf(c);

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
                decrementWorkerCount();
                return null;
            }

            int wc = workerCountOf(c);

            // Are workers subject to culling?
            boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;

            if ((wc > maximumPoolSize || (timed && timedOut))
                && (wc > 1 || workQueue.isEmpty())) {
                if (compareAndDecrementWorkerCount(c))
                    return null;
                continue;
            }

            try {
                Runnable r = timed ?
                    workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                    workQueue.take();
                if (r != null)
                    return r;
                timedOut = true;
            } catch (InterruptedException retry) {
                timedOut = false;
            }
        }
    }
  • 主要看這幾行代碼

  • getTask方法通過調用任務隊列的take方法,不斷的獲取線程

  • 如果任務隊列里面數量為0,則會一直阻塞,一直等到有任務加入,從而保證了核心線程不被摧毀

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java三種求水仙花數的方法

    Java三種求水仙花數的方法

    本篇文章通過求水仙花數的實例來讓大家對JAVA求數的概念和方法有更深入的理解和應用,學習參考下吧。
    2018-02-02
  • SpringMVC異步處理的 5 種方式示例詳解

    SpringMVC異步處理的 5 種方式示例詳解

    這篇文章主要介紹了SpringMVC異步處理的 5 種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • UniApp?+?SpringBoot?實現支付寶支付和退款功能

    UniApp?+?SpringBoot?實現支付寶支付和退款功能

    這篇文章主要介紹了UniApp?+?SpringBoot?實現支付寶支付和退款功能,基本的?SpringBoot?的腳手架,可以去IDEA?自帶的快速生成腳手架插件,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2022-06-06
  • SpringBoot使用Redis清除所有緩存實現方式

    SpringBoot使用Redis清除所有緩存實現方式

    文章介紹通過遍歷刪除Redis所有key的方法,推薦使用RedisTemplate的delete方法而非StringRedisTemplate,需確保緩存操作統(tǒng)一使用同類型模板,避免類型不匹配問題
    2025-08-08
  • Java的Tomcat和Servlet的運行原理詳解

    Java的Tomcat和Servlet的運行原理詳解

    這篇文章主要為大家詳細介紹了Java的Tomcat和Servlet,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳解Java 自動裝箱與自動拆箱

    詳解Java 自動裝箱與自動拆箱

    這篇文章主要介紹了Java 自動裝箱與自動拆箱的相關資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-09-09
  • Java實現AWT四大事件的詳細過程

    Java實現AWT四大事件的詳細過程

    AWT的事件處理是一種委派式事件處理方式:普通組件(事件源)將整個事件處理委托給特定的對象(事件監(jiān)聽器);當該事件源發(fā)生指定的事件時,就通知所委托的事件監(jiān)聽器,由事件監(jiān)聽器來處理這個事件
    2022-04-04
  • mac下idea啟動web項目報錯java.net.SocketException:socket closed問題

    mac下idea啟動web項目報錯java.net.SocketException:socket closed

    本文主要介紹了作者在項目啟動時遇到的一個問題——無法打開調試端口,經過一系列排查和嘗試,最終發(fā)現是由于權限問題導致的,作者還分享了如何修改文件權限的方法,并提醒大家不要隨意kill掉占用端口的進程
    2024-12-12
  • 淺談Java數值類型的轉換與強制轉換

    淺談Java數值類型的轉換與強制轉換

    這篇文章主要介紹了Java數值類型的轉換與強制轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • springboot jdbctemplate如何實現多數據源

    springboot jdbctemplate如何實現多數據源

    這篇文章主要介紹了springboot jdbctemplate如何實現多數據源問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論

绩溪县| 化德县| 都安| 曲水县| 溧阳市| 唐河县| 科技| 故城县| 邵武市| 平乐县| 塘沽区| 准格尔旗| 古田县| 阆中市| 山阳县| 留坝县| 绿春县| 怀柔区| 满城县| 焉耆| 太仆寺旗| 淮北市| 东宁县| 镶黄旗| 伽师县| 香格里拉县| 双鸭山市| 新建县| 汤原县| 会理县| 虹口区| 和平区| 玉林市| 邢台县| 兴义市| 伊春市| 台南县| 汽车| 阿图什市| 双鸭山市| 股票|