成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java線程池ThreadPoolExecutor的原理是什么

Java線程池ThreadPoolExecutor的原理是什么?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

十余年的榮縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整榮縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“榮縣網(wǎng)站設(shè)計(jì)”,“榮縣網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

1、JUC同步器框架

ThreadPoolExecutor里面使用到JUC同步器框架,主要用于四個(gè)方面:

(1)全局鎖mainLock成員屬性,是可重入鎖ReentrantLock類型,主要是用于訪問工作線程Worker集合和進(jìn)行數(shù)據(jù)統(tǒng)計(jì)記錄時(shí)候的加鎖操作。

(2)條件變量termination,Condition類型,主要用于線程進(jìn)行等待終結(jié)awaitTermination()方法時(shí)的帶期限阻塞。

(3)任務(wù)隊(duì)列workQueue,BlockingQueue類型,任務(wù)隊(duì)列,用于存放待執(zhí)行的任務(wù)。

(4)工作線程,內(nèi)部類Worker類型,是線程池中真正的工作線程對象。

2、核心線程

這里先參考ThreadPoolExecutor的實(shí)現(xiàn)并且進(jìn)行簡化,實(shí)現(xiàn)一個(gè)只有核心線程的線程池,要求如下:暫時(shí)不考慮任務(wù)執(zhí)行異常情況下的處理;任務(wù)隊(duì)列為無界隊(duì)列;線程池容量固定為核心線程數(shù)量;暫時(shí)不考慮拒絕策略。

public class CoreThreadPool implements Executor {

    private BlockingQueue<Runnable> workQueue;
    private static final AtomicInteger COUNTER = new AtomicInteger();
    private int coreSize;
    private int threadCount = 0;

    public CoreThreadPool(int coreSize) {
        this.coreSize = coreSize;
        this.workQueue = new LinkedBlockingQueue<>();
    }

    @Override
    public void execute(Runnable command) {
        if (++threadCount <= coreSize) {
            new Worker(command).start();
        } else {
            try {
                workQueue.put(command);
            } catch (InterruptedException e) {
                throw new IllegalStateException(e);
            }
        }
    }

    private class Worker extends Thread {
        private Runnable firstTask;

        public Worker(Runnable runnable) {
            super(String.format("Worker-%d", COUNTER.getAndIncrement()));
            this.firstTask = runnable;
        }

        @Override
        public void run() {
            Runnable task = this.firstTask;
            while (null != task || null != (task = getTask())) {
                try {
                    task.run();
                } finally {
                    task = null;
                }
            }
        }
    }

    private Runnable getTask() {
        try {
            return workQueue.take();
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }

    public static void main(String[] args) throws Exception {
        CoreThreadPool pool = new CoreThreadPool(5);
        IntStream.range(0, 10)
                .forEach(i -> pool.execute(() ->
                        System.out.println(String.format("Thread:%s,value:%d", Thread.currentThread().getName(), i))));
        Thread.sleep(Integer.MAX_VALUE);
    }
}

某次運(yùn)行結(jié)果如下:

Thread:Worker-0,value:0

Thread:Worker-3,value:3

Thread:Worker-2,value:2

Thread:Worker-1,value:1

Thread:Worker-4,value:4

Thread:Worker-1,value:5

Thread:Worker-2,value:8

Thread:Worker-4,value:7

Thread:Worker-0,value:6

Thread:Worker-3,value:9

設(shè)計(jì)此線程池的時(shí)候,核心線程是懶創(chuàng)建的,如果線程空閑的時(shí)候則阻塞在任務(wù)隊(duì)列的take()方法,其實(shí)對于ThreadPoolExecutor也是類似這樣實(shí)現(xiàn),只是如果使用了keepAliveTime并且允許核心線程超時(shí)則會使用BlockingQueue#poll進(jìn)行輪詢代替永久阻塞。

3、其他附加功能

構(gòu)建ThreadPoolExecutor實(shí)例的時(shí)候,需要定義maximumPoolSize(線程池最大線程數(shù))和corePoolSize(核心線程數(shù))。當(dāng)任務(wù)隊(duì)列是有界的阻塞隊(duì)列,核心線程滿負(fù)載,任務(wù)隊(duì)列已經(jīng)滿的情況下,會嘗試創(chuàng)建額外的maximumPoolSize - corePoolSize個(gè)線程去執(zhí)行新提交的任務(wù)。當(dāng)ThreadPoolExecutor這里實(shí)現(xiàn)的兩個(gè)主要附加功能是:

(1)一定條件下會創(chuàng)建非核心線程去執(zhí)行任務(wù),非核心線程的回收周期(線程生命周期終結(jié)時(shí)刻)是keepAliveTime,線程生命周期終結(jié)的條件是:下一次通過任務(wù)隊(duì)列獲取任務(wù)的時(shí)候并且存活時(shí)間超過keepAliveTime。

(2)提供拒絕策略,也就是在核心線程滿負(fù)載、任務(wù)隊(duì)列已滿、非核心線程滿負(fù)載的條件下會觸發(fā)拒絕策略。

關(guān)于Java線程池ThreadPoolExecutor的原理是什么問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

網(wǎng)頁標(biāo)題:Java線程池ThreadPoolExecutor的原理是什么
網(wǎng)頁鏈接:http://jinyejixie.com/article26/pgsccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄定制網(wǎng)站、做網(wǎng)站、ChatGPT網(wǎng)站排名、移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
孝感市| 三亚市| 天津市| 大洼县| 钟山县| 灵武市| 秦皇岛市| 登封市| 青河县| 青河县| 新竹市| 齐齐哈尔市| 沾益县| 汝阳县| 宿迁市| 漠河县| 库车县| 大英县| 石狮市| 新民市| 巧家县| 桓台县| 泊头市| 桐梓县| 兰溪市| 柳江县| 盐池县| 绩溪县| 化州市| 六枝特区| 上虞市| 古田县| 齐河县| 洛川县| 布尔津县| 长兴县| 石家庄市| 阿拉善左旗| 平原县| 平湖市| 大名县|