成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

(十七)java多線(xiàn)程之ThreadPoolExecutor

wpw / 1918人閱讀

摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言在之前的例子我們要?jiǎng)?chuàng)建多個(gè)線(xiàn)程處理一批任務(wù)的時(shí)候我是通過(guò)創(chuàng)建線(xiàn)程數(shù)組或者使用線(xiàn)程集合來(lái)管理的但是這樣做不太好因?yàn)檫@些線(xiàn)程沒(méi)有被重復(fù)利用所以這里要引入線(xiàn)程池今天我們就講線(xiàn)程

本人郵箱:
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代碼已經(jīng)全部托管github有需要的同學(xué)自行下載

引言

在之前的例子,我們要?jiǎng)?chuàng)建多個(gè)線(xiàn)程處理一批任務(wù)的時(shí)候.我是通過(guò)創(chuàng)建線(xiàn)程數(shù)組,或者使用線(xiàn)程集合來(lái)管理的.但是這樣做不太好,因?yàn)檫@些線(xiàn)程沒(méi)有被重復(fù)利用.所以這里要引入線(xiàn)程池,今天我們就講線(xiàn)程池執(zhí)行器ThreadPoolExecutor.

理論

首先我們來(lái)看一下它的構(gòu)造器:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 這個(gè)是ThreadPoolExecutor完整的構(gòu)造器,其他的構(gòu)造器其實(shí)也是在內(nèi)部調(diào)用這個(gè).

corePoolSize 核心線(xiàn)程數(shù),線(xiàn)程池保留線(xiàn)程的數(shù)量,即使這些線(xiàn)程是空閑.除非設(shè)置了allowCoreThreadTimeOut

maximumPoolSize 線(xiàn)程池最大允許的線(xiàn)程數(shù).

keepAliveTime 當(dāng)當(dāng)前的線(xiàn)程數(shù)大于核心線(xiàn)程數(shù),那么這些多余的空閑的線(xiàn)程在被終止之前能等待新任務(wù)的時(shí)間.

unit keepAliveTime時(shí)間的單位

workQueue 這個(gè)是用來(lái)保留將要執(zhí)行的工作隊(duì)列.

threadFactory 用于創(chuàng)建新線(xiàn)程的工廠(chǎng)

handler 如果工作隊(duì)列(workQueue)滿(mǎn)了,那么這個(gè)handler是將會(huì)被執(zhí)行.

ThreadPoolExecutor還有幾個(gè)可不帶threadFactoryhandler慘的構(gòu)造器,說(shuō)明java提供了一些默認(rèn)的配置,讓我們看一下.

如果構(gòu)造不帶threadFactory,那么默認(rèn)使用java.util.concurrent.Executors.DefaultThreadFactory創(chuàng)建出一個(gè)新的工廠(chǎng)對(duì)象.通過(guò)閱讀源代碼,主要是在創(chuàng)建新的線(xiàn)程的時(shí)候修改了線(xiàn)程名為pool-全局線(xiàn)程池遞增數(shù)編號(hào)-thread-當(dāng)前線(xiàn)程池線(xiàn)程遞增編號(hào),讓線(xiàn)程改為非守護(hù)線(xiàn)程,并設(shè)置線(xiàn)程的優(yōu)先級(jí)為NORM_PRIORITY.

ok,再看一下handler有什么默認(rèn)值.

java.util.concurrent.ThreadPoolExecutor.AbortPolicy 這個(gè)是默認(rèn)使用的拒絕策略,如果有要執(zhí)行的任務(wù)隊(duì)列已滿(mǎn),且還有任務(wù)提交,則直接拋出異常信息

java.util.concurrent.ThreadPoolExecutor.DiscardPolicy 這個(gè)是忽略策略,如果有要執(zhí)行的任務(wù)隊(duì)列已滿(mǎn),且還有任務(wù)提交,則直接忽略掉這個(gè)任務(wù),即不拋出異常也不做任何處理.

java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy 忽略最早提交的任務(wù).如果有要執(zhí)行的任務(wù)隊(duì)列已滿(mǎn),此時(shí)若還有任務(wù)提交且線(xiàn)程池還沒(méi)有停止,則把隊(duì)列中最早提交的任務(wù)拋棄掉,然后把當(dāng)前任務(wù)加入隊(duì)列中.

java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy 這個(gè)是來(lái)著不拒策略.如果有要執(zhí)行的任務(wù)隊(duì)列已滿(mǎn),此時(shí)若還有任務(wù)提交且線(xiàn)程池還沒(méi)有停止,則直接運(yùn)行任務(wù)的run方法.

例子 使用默認(rèn)的拒絕策略AbortPolicy
public class Demo1 {
    public static void main(String[] args) {
        BlockingQueue queue = new ArrayBlockingQueue(10);
        RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 3, 0, TimeUnit.SECONDS, queue, handler);
        for (int i = 0; i < 20; i ++){
            final int temp = i;
            pool.execute(() -> {
                System.out.println("客戶(hù)" + temp + "來(lái)了.......");
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        pool.shutdown();
    }
}

Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.kco.test17.demo1.Demo1$$Lambda$1/15497079@ca494b rejected from java.util.concurrent.ThreadPoolExecutor@1a4f24f[Running, pool size = 5, active threads = 5, queued tasks = 10, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
at com.kco.test17.demo1.Demo1.main(Demo1.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
pool-1-thread-1客戶(hù)0來(lái)了.......
pool-1-thread-2客戶(hù)1來(lái)了.......
pool-1-thread-3客戶(hù)2來(lái)了.......
pool-1-thread-5客戶(hù)14來(lái)了.......
pool-1-thread-4客戶(hù)13來(lái)了.......
pool-1-thread-2客戶(hù)3來(lái)了.......
pool-1-thread-1客戶(hù)4來(lái)了.......
pool-1-thread-5客戶(hù)5來(lái)了.......
pool-1-thread-3客戶(hù)6來(lái)了.......
pool-1-thread-4客戶(hù)7來(lái)了.......
pool-1-thread-2客戶(hù)9來(lái)了.......
pool-1-thread-1客戶(hù)8來(lái)了.......
pool-1-thread-3客戶(hù)10來(lái)了.......
pool-1-thread-5客戶(hù)11來(lái)了.......
pool-1-thread-4客戶(hù)12來(lái)了.......

從結(jié)果看出來(lái),可以看出線(xiàn)程是重復(fù)被使用的,而且當(dāng)執(zhí)行的任務(wù)超過(guò)工作隊(duì)列的容量時(shí),線(xiàn)程確實(shí)拋出了異常.

例子2 使用忽略策略 DiscardPolicy

RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();改為 RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
運(yùn)行結(jié)果如下:

pool-1-thread-1客戶(hù)0來(lái)了.......
pool-1-thread-3客戶(hù)2來(lái)了.......
pool-1-thread-4客戶(hù)13來(lái)了.......
pool-1-thread-5客戶(hù)14來(lái)了.......
pool-1-thread-3客戶(hù)3來(lái)了.......
pool-1-thread-4客戶(hù)4來(lái)了.......
pool-1-thread-1客戶(hù)5來(lái)了.......
pool-1-thread-5客戶(hù)6來(lái)了.......
pool-1-thread-2客戶(hù)1來(lái)了.......
pool-1-thread-3客戶(hù)7來(lái)了.......
pool-1-thread-4客戶(hù)8來(lái)了.......
pool-1-thread-5客戶(hù)9來(lái)了.......
pool-1-thread-1客戶(hù)10來(lái)了.......
pool-1-thread-2客戶(hù)11來(lái)了.......
pool-1-thread-4客戶(hù)12來(lái)了.......

現(xiàn)在線(xiàn)程池正確退出了,而且也不拋出異常了,但是超過(guò)工作隊(duì)列容量的任務(wù)全部被忽略了.

例子3 使用忽略最早任務(wù)策略 DiscardOldestPolicy

RejectedExecutionHandler改為RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardOldestPolicy();

pool-1-thread-1客戶(hù)0來(lái)了.......
pool-1-thread-2客戶(hù)1來(lái)了.......
pool-1-thread-3客戶(hù)2來(lái)了.......
pool-1-thread-5客戶(hù)14來(lái)了.......
pool-1-thread-4客戶(hù)13來(lái)了.......
pool-1-thread-4客戶(hù)8來(lái)了.......
pool-1-thread-1客戶(hù)11來(lái)了.......
pool-1-thread-5客戶(hù)10來(lái)了.......
pool-1-thread-3客戶(hù)9來(lái)了.......
pool-1-thread-2客戶(hù)12來(lái)了.......
pool-1-thread-1客戶(hù)15來(lái)了.......
pool-1-thread-4客戶(hù)16來(lái)了.......
pool-1-thread-5客戶(hù)17來(lái)了.......
pool-1-thread-2客戶(hù)19來(lái)了.......
pool-1-thread-3客戶(hù)18來(lái)了.......

從以上結(jié)果,我們可以看出除了客戶(hù)0客戶(hù)2剛好是3個(gè)核心線(xiàn)程被執(zhí)行后,客戶(hù)3客戶(hù)7直接被忽略掉了.

例子4 使用來(lái)著不拒策略 CallerRunsPolicy

同樣講拒絕策略改為RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
運(yùn)行程序,結(jié)果如下:

pool-1-thread-1客戶(hù)0來(lái)了.......
pool-1-thread-2客戶(hù)1來(lái)了.......
pool-1-thread-3客戶(hù)2來(lái)了.......
pool-1-thread-4客戶(hù)13來(lái)了.......
main客戶(hù)15來(lái)了.......
pool-1-thread-5客戶(hù)14來(lái)了.......
pool-1-thread-2客戶(hù)3來(lái)了.......
pool-1-thread-1客戶(hù)4來(lái)了.......
main客戶(hù)18來(lái)了.......
pool-1-thread-3客戶(hù)5來(lái)了.......
pool-1-thread-4客戶(hù)7來(lái)了.......
pool-1-thread-5客戶(hù)6來(lái)了.......
pool-1-thread-5客戶(hù)8來(lái)了.......
pool-1-thread-1客戶(hù)9來(lái)了.......
pool-1-thread-4客戶(hù)10來(lái)了.......
pool-1-thread-3客戶(hù)12來(lái)了.......
pool-1-thread-2客戶(hù)11來(lái)了.......
pool-1-thread-1客戶(hù)16來(lái)了.......
pool-1-thread-5客戶(hù)19來(lái)了.......
pool-1-thread-3客戶(hù)17來(lái)了.......

結(jié)果,我們可以發(fā)現(xiàn)所有的任務(wù)都被執(zhí)行,而且竟然還有兩個(gè)是在主線(xiàn)程執(zhí)行的.現(xiàn)在明白我之前說(shuō)的則直接運(yùn)行任務(wù)的run方法的意思了吧,沒(méi)錯(cuò)是直接調(diào)用run方法,而不是開(kāi)啟線(xiàn)程去執(zhí)行任務(wù).

例子5 使用自定義的拒絕策略

現(xiàn)在我們自己寫(xiě)一個(gè)拒絕策略,要求所有的任務(wù)都必須被線(xiàn)程池執(zhí)行,而且都要在線(xiàn)程池中執(zhí)行.

public class Demo5 {
    public static void main(String[] args) {
        BlockingQueue queue = new ArrayBlockingQueue(10);
        RejectedExecutionHandler handler = new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                if (!executor.isShutdown()){
                    try {
                        executor.getQueue().put(r);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 5, 0, TimeUnit.SECONDS, queue, handler);
        for (int i = 0; i < 20; i ++){
            final int temp = i;
            pool.execute(() -> {
                String name = Thread.currentThread().getName();
                System.out.println(name + "客戶(hù)" + temp + "來(lái)了.......");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        pool.shutdown();
    }
}

運(yùn)行結(jié)果:

pool-1-thread-1客戶(hù)0來(lái)了.......
pool-1-thread-3客戶(hù)2來(lái)了.......
pool-1-thread-5客戶(hù)14來(lái)了.......
pool-1-thread-4客戶(hù)13來(lái)了.......
pool-1-thread-2客戶(hù)1來(lái)了.......
pool-1-thread-1客戶(hù)3來(lái)了.......
pool-1-thread-3客戶(hù)4來(lái)了.......
pool-1-thread-5客戶(hù)5來(lái)了.......
pool-1-thread-2客戶(hù)6來(lái)了.......
pool-1-thread-4客戶(hù)7來(lái)了.......
pool-1-thread-1客戶(hù)8來(lái)了.......
pool-1-thread-3客戶(hù)9來(lái)了.......
pool-1-thread-5客戶(hù)10來(lái)了.......
pool-1-thread-4客戶(hù)11來(lái)了.......
pool-1-thread-2客戶(hù)12來(lái)了.......
pool-1-thread-1客戶(hù)15來(lái)了.......
pool-1-thread-3客戶(hù)16來(lái)了.......
pool-1-thread-5客戶(hù)17來(lái)了.......
pool-1-thread-4客戶(hù)19來(lái)了.......
pool-1-thread-2客戶(hù)18來(lái)了.......

ok.所有任務(wù)都被線(xiàn)程池執(zhí)行了.而且我們自定義的拒絕策略也很簡(jiǎn)單,就是讓工作隊(duì)列調(diào)用put讓其一直等待,直到有可用的容量存放任務(wù).

打賞

如果覺(jué)得我的文章寫(xiě)的還過(guò)得去的話(huà),有錢(qián)就捧個(gè)錢(qián)場(chǎng),沒(méi)錢(qián)給我捧個(gè)人場(chǎng)(幫我點(diǎn)贊或推薦一下)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/69962.html

相關(guān)文章

  • Java線(xiàn)程進(jìn)階(十七)—— J.U.Catomic框架:LongAdder

    摘要:在并發(fā)量較低的環(huán)境下,線(xiàn)程沖突的概率比較小,自旋的次數(shù)不會(huì)很多。比如有三個(gè),每個(gè)線(xiàn)程對(duì)增加。的核心方法還是通過(guò)例子來(lái)看假設(shè)現(xiàn)在有一個(gè)對(duì)象,四個(gè)線(xiàn)程同時(shí)對(duì)進(jìn)行累加操作。 showImg(https://segmentfault.com/img/remote/1460000016012084); 本文首發(fā)于一世流云的專(zhuān)欄:https://segmentfault.com/blog... ...

    fengxiuping 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線(xiàn)程核心線(xiàn)程非核心線(xiàn)程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線(xiàn)程池工作原則當(dāng)線(xiàn)程池中線(xiàn)程數(shù)量小于則創(chuàng)建線(xiàn)程,并處理請(qǐng)求。當(dāng)線(xiàn)程池中的數(shù)量等于最大線(xiàn)程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線(xiàn)程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0
  • Java線(xiàn)程(2):使用線(xiàn)程ThreadPoolExecutor

    摘要:本文只介紹中線(xiàn)程池的基本使用,不會(huì)過(guò)多的涉及到線(xiàn)程池的原理??删彺婢€(xiàn)程的線(xiàn)程池創(chuàng)建一個(gè)可緩存線(xiàn)程的線(xiàn)程池。首先是從接口繼承到的方法使用該方法即將一個(gè)任務(wù)交給線(xiàn)程池去執(zhí)行。方法方法的作用是向線(xiàn)程池發(fā)送關(guān)閉的指令。 首先,我們?yōu)槭裁葱枰€(xiàn)程池?讓我們先來(lái)了解下什么是 對(duì)象池 技術(shù)。某些對(duì)象(比如線(xiàn)程,數(shù)據(jù)庫(kù)連接等),它們創(chuàng)建的代價(jià)是非常大的 —— 相比于一般對(duì)象,它們創(chuàng)建消耗的時(shí)間和內(nèi)存都...

    darry 評(píng)論0 收藏0
  • (十八)java線(xiàn)程Callable Future

    摘要:本人郵箱歡迎轉(zhuǎn)載轉(zhuǎn)載請(qǐng)注明網(wǎng)址代碼已經(jīng)全部托管有需要的同學(xué)自行下載引言前面我們講了那么多有關(guān)線(xiàn)程的知識(shí)不知道讀者有沒(méi)有想過(guò)這么一個(gè)問(wèn)題如果有這么一個(gè)比較耗時(shí)的任務(wù)必須使用線(xiàn)程來(lái)執(zhí)行但是在這個(gè)任務(wù)執(zhí)行完之后我需要得到這個(gè)線(xiàn)程的返回值以目前我們 本人郵箱: 歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明網(wǎng)址 http://blog.csdn.net/tianshi_kcogithub: https://github...

    stormgens 評(píng)論0 收藏0
  • 初讀《Java并發(fā)編程的藝術(shù)》-第十章:Executor框架 -10.1 Executor框架簡(jiǎn)介

    摘要:線(xiàn)程的啟動(dòng)與銷(xiāo)毀都與本地線(xiàn)程同步。操作系統(tǒng)會(huì)調(diào)度所有線(xiàn)程并將它們分配給可用的。框架的成員主要成員線(xiàn)程池接口接口接口以及工具類(lèi)。創(chuàng)建單個(gè)線(xiàn)程的接口與其實(shí)現(xiàn)類(lèi)用于表示異步計(jì)算的結(jié)果。參考書(shū)籍并發(fā)編程的藝術(shù)方騰飛魏鵬程曉明著 在java中,直接使用線(xiàn)程來(lái)異步的執(zhí)行任務(wù),線(xiàn)程的每次創(chuàng)建與銷(xiāo)毀需要一定的計(jì)算機(jī)資源開(kāi)銷(xiāo)。每個(gè)任務(wù)創(chuàng)建一個(gè)線(xiàn)程的話(huà),當(dāng)任務(wù)數(shù)量多的時(shí)候,則對(duì)應(yīng)的創(chuàng)建銷(xiāo)毀開(kāi)銷(xiāo)會(huì)消耗大量...

    aisuhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<