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

jdk線(xiàn)程池的實(shí)現(xiàn)

 更新時(shí)間:2023年04月04日 15:51:07   作者:ThinkPet  
本文主要介紹了jdk線(xiàn)程池的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

jdk線(xiàn)程池ThreadPoolExecutor的7個(gè)參數(shù)

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

corePoolSize

核心線(xiàn)程個(gè)數(shù) ,int類(lèi)型

maximunPoolSize

最大線(xiàn)程數(shù) ,int類(lèi)型

keepAliveTime存活時(shí)間

傳long類(lèi)型的值,

當(dāng)線(xiàn)程池中的線(xiàn)程數(shù)大于corePoolSize核心線(xiàn)程個(gè)數(shù),且線(xiàn)程是閑置狀態(tài),則這些空閑線(xiàn)程的最大存活時(shí)間是KeepAliveTime

TimeUnit

存活時(shí)間的單位, 有時(shí)/分/秒/毫秒等可選配置

workQueue

存放待執(zhí)行任務(wù)的阻塞隊(duì)列, 可傳入

arrayBlockingQueue 基于數(shù)組的有界阻塞隊(duì)列;

linkedBlockingQueue基于鏈表的無(wú)界阻塞隊(duì)列;

synchronousQueue最多只有1個(gè)元素的同步隊(duì)列, 隊(duì)列容量是1;

priorityBlockingQueue帶優(yōu)先級(jí)的無(wú)界阻塞隊(duì)列,出隊(duì)元素是優(yōu)先級(jí)最高或最低的元素;

DelayQueue 帶延遲功能的無(wú)界阻塞隊(duì)列, 過(guò)期元素才會(huì)出隊(duì),隊(duì)頭元素是快要過(guò)期的元素.

以上幾個(gè)Queue都是BlockingQueue的實(shí)現(xiàn)類(lèi)

threadFactory

創(chuàng)建線(xiàn)程的工廠(chǎng),

jdk提供了DefaultThreadFactory默認(rèn)工廠(chǎng),

用Executors.defaultThreadFactory()就行.

RejectedExecutionHandler拒絕策略

當(dāng)隊(duì)列滿(mǎn)且線(xiàn)程數(shù)達(dá)到maximunPoolSize最大線(xiàn)程數(shù)后采取的策略, 可傳入

AbortPolicy 拋出異常,這個(gè)是默認(rèn)策略.

CallersRunPolicy 由調(diào)用者所在的線(xiàn)程執(zhí)行任務(wù)

DiscardOldestPolicy 丟棄最老的任務(wù)

DiscardPolicy 丟棄新任務(wù),不拋出異常

jdk提供的Executors快速創(chuàng)建線(xiàn)程池的用法

jdk封裝了一個(gè)Executors類(lèi)可以直接創(chuàng)建各種線(xiàn)程池,

用法形如

ExecutorService pool = Executors.newXXXXXPool()

可以用Executors類(lèi)創(chuàng)建業(yè)務(wù)常用的3種線(xiàn)程池

固定線(xiàn)程池

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

創(chuàng)建一個(gè)核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)相同的線(xiàn)程池,都為nThreads,

且線(xiàn)程池的阻塞隊(duì)列長(zhǎng)度是Integer.MAX_VALUE,

且keepAliveTime=0,說(shuō)明只要線(xiàn)程個(gè)數(shù)比核心線(xiàn)程個(gè)數(shù)多并且當(dāng)前空閑則回收.

單線(xiàn)程線(xiàn)程池

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

創(chuàng)建一個(gè)核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)都是1的線(xiàn)程池,

且線(xiàn)程池的阻塞隊(duì)列長(zhǎng)度是Integer.MAX_VALUE,

且keepAliveTime=0,說(shuō)明只要線(xiàn)程個(gè)數(shù)比核心線(xiàn)程個(gè)數(shù)多并且當(dāng)前空閑則回收.

已緩存的線(xiàn)程池

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

創(chuàng)建一個(gè)按需創(chuàng)建線(xiàn)程的線(xiàn)程池,初始線(xiàn)程個(gè)數(shù)為0,最多線(xiàn)程個(gè)數(shù)為

Integer.MAX_VALUE,并且阻塞隊(duì)列為同步隊(duì)列.

keepAliveTime=60,說(shuō)明當(dāng)前線(xiàn)程在60s內(nèi)空閑則回收.

CachedThreadPool的特殊之處在于,加入同步隊(duì)列的任務(wù)會(huì)被馬上執(zhí)行,同步隊(duì)列里邊最多只有1個(gè)任務(wù).

使用創(chuàng)建好的ExecutorService 線(xiàn)程池執(zhí)行異步任務(wù)

submit操作

提交一個(gè)任務(wù), 任務(wù)參數(shù)可以是 Runnable實(shí)現(xiàn)類(lèi) 或 Callable 實(shí)現(xiàn)類(lèi).

返回的類(lèi)型是Future 表示異步計(jì)算的結(jié)果, 可以用future.get()方法拿到數(shù)據(jù).

shutdown操作

調(diào)用shutdown方法后,線(xiàn)程池就不會(huì)再接受新的任務(wù)了,但是工作隊(duì)列里邊的任務(wù)還是要執(zhí)行的, 該方法會(huì)立刻返回,不等待隊(duì)列任務(wù)完成再返回.

使用線(xiàn)程池的情況下當(dāng)程序結(jié)束時(shí)記得調(diào)用shutdown關(guān)閉線(xiàn)程池, 如果不關(guān)閉線(xiàn)程池,則會(huì)導(dǎo)致 線(xiàn)程池資源一直不被釋放.

shutdownNow操作

調(diào)用shutdownNow方法后,線(xiàn)程池就不會(huì)再接受新的任務(wù)了,并且會(huì)丟棄工作隊(duì)列里邊的任務(wù),正在執(zhí)行的任務(wù)會(huì)被中斷,該方法會(huì)立刻返回,并不等待激活的任務(wù)執(zhí)行完成. 返回值為這時(shí)候隊(duì)列里面被丟棄的任務(wù)列表.

awaitTermination操作

當(dāng)線(xiàn)程調(diào)用awaitTermination方法后,當(dāng)前線(xiàn)程會(huì)被阻塞, 直到線(xiàn)程池狀態(tài)變?yōu)門(mén)ERMINATED 才返回,或者等待時(shí)間超時(shí)才返回.

案例1-測(cè)試FixedThreadPool執(zhí)行CallableTask任務(wù)

package cn.demo;

import cn.hutool.core.util.RandomUtil;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ExecutorTestsForCallableTask {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        String res1 = "";
        String res2 = "";
        String res3 = "";
        String res4 = "";

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

        //submit 提交4個(gè)任務(wù), 實(shí)際執(zhí)行時(shí),任務(wù)是并發(fā)執(zhí)行的,執(zhí)行順序不固定
        Future<String> submit1 = fixedThreadPool.submit(
                new TestCallableTask(RandomUtil.randomInt(30,1000),"t1"));
        Future<String> submit2 = fixedThreadPool.submit(
                new TestCallableTask(RandomUtil.randomInt(100,400),"t2"));
        Future<String> submit3 = fixedThreadPool.submit(
                new TestCallableTask(RandomUtil.randomInt(30,350),"t3"));
        Future<String> submit4 = fixedThreadPool.submit(
                new TestCallableTask(RandomUtil.randomInt(310,500),"t4"));

        res1 = submit1.get();
        System.out.println(res1);
        res2 = submit2.get();
        System.out.println(res2);
        res3 = submit3.get();
        System.out.println(res3);
        res4 = submit4.get();
        System.out.println(res4);

        fixedThreadPool.shutdown();
    }
}
package cn.demo;


import cn.hutool.core.util.RandomUtil;

import java.time.LocalDateTime;
import java.util.concurrent.Callable;

public class TestCallableTask implements Callable<String> {

    private int testIntVal;
    private String taskSeq;

    public TestCallableTask(int testIntVal, String taskSeq) {
        this.testIntVal = testIntVal;
        this.taskSeq = taskSeq;
    }

    @Override
    public  String call() throws Exception {
        String s = LocalDateTime.now().toString();
        System.out.println(s+"->"+taskSeq+" run ....");

        int i = testIntVal;
        System.out.println(i);

        try {
            Thread.sleep(RandomUtil.randomInt(100,300));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        if (i>300){
            return "300more";
        }else {
            return "300less";
        }
    }
}

案例2-測(cè)試FixedThreadPool執(zhí)行RunnableTask任務(wù)

package cn.demo;

import java.util.concurrent.*;

public class ExecutorTestsForRunnableTask {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        String res1 = "";
        String res2 = "";
        String res3 = "";
        String res4 = "";
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

        //submit 提交4個(gè)任務(wù), 實(shí)際執(zhí)行時(shí),任務(wù)是并發(fā)執(zhí)行的,執(zhí)行順序不固定
        Task1Param task1Param = new Task1Param();
        task1Param.setUrl("f23r3r");
        task1Param.setName("1heg43t34t34t");
        Future<String> stringFuture = fixedThreadPool.submit(
            new TestTask1Runnable(task1Param), "success1 ok");

        Task1Param t2 = new Task1Param();
        t2.setUrl("gnsg2323");
        t2.setName("2wwswer2r1asdaaws");
        Future<String> f2 = fixedThreadPool.submit(new TestTask1Runnable(t2), "success2 ok");

        Task1Param t3 = new Task1Param();
        t3.setUrl("thwasr23r");
        t3.setName("3erzawfe23rawsf");
        Future<String> f3 = fixedThreadPool.submit(new TestTask1Runnable(t3), "success3 ok");

        Task1Param t4 = new Task1Param();
        t4.setUrl("mjkdsragt");
        t4.setName("4tbertydraewrsfk");
        Future<String> f4 = fixedThreadPool.submit(new TestTask1Runnable(t4), "success4 ok");


        res1 = stringFuture.get();
        System.out.println(res1);
        res2 = f2.get();
        System.out.println(res2);
        res3 = f3.get();
        System.out.println(res3);
        res4 = f4.get();
        System.out.println(res4);

        fixedThreadPool.shutdown();
    }
}
package cn.demo;

import cn.hutool.core.util.RandomUtil;
import java.time.LocalDateTime;

public class TestTask1Runnable implements Runnable{

    private Task1Param task1Param;

    public TestTask1Runnable(Task1Param task1Param) {
        this.task1Param = task1Param;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(RandomUtil.randomInt(200,600));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(task1Param.getName());
        System.out.println(task1Param.getUrl());
        String s = LocalDateTime.now().toString();
        System.out.println(s+" TestTask1Runnable run ....");
    }
}

使用自定義的ThreadPoolExecutor來(lái)執(zhí)行異步任務(wù)

package cn.demo;


import cn.hutool.core.util.RandomUtil;
import java.util.concurrent.*;

public class TpeTest {

    private final static ThreadPoolExecutor pool =
            new ThreadPoolExecutor(
                    1,1,
                    1L, TimeUnit.MINUTES,
                    new ArrayBlockingQueue<Runnable>(1),
                    new ThreadPoolExecutor.CallerRunsPolicy());
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Future<String> submit1 = pool.submit(
                new TestCallableTask(RandomUtil.randomInt(30,1000),"t1"));
        Future<String> submit2 = pool.submit(
                new TestCallableTask(RandomUtil.randomInt(100,400),"t2"));
        Future<String> submit3 = pool.submit(
                new TestCallableTask(RandomUtil.randomInt(30,350),"t3"));
        Future<String> submit4 = pool.submit(
                new TestCallableTask(RandomUtil.randomInt(310,500),"t4"));
        System.out.println("task1-"+submit1.get());
        System.out.println("task2-"+submit2.get());
        System.out.println("task3-"+submit3.get());
        System.out.println("task4-"+submit4.get());

        pool.shutdown();
    }
}

線(xiàn)程池使用FutureTask時(shí)需要注意的事情

線(xiàn)程池使用FutureTask時(shí),如果把拒絕策略設(shè)置為 DiscardPolicy 和 DiscardOldestPolicy,并且在被拒絕的任務(wù)的Future對(duì)象上調(diào)用了無(wú)參get方法,那么調(diào)用線(xiàn)程會(huì)一直被阻塞.

如上面的代碼,如果把CallerRunsPolicy替換成 DiscardPolicy 或 DiscardOldestPolicy ,就會(huì)導(dǎo)致任務(wù)一直被阻塞,一直無(wú)法取到future.get()的值.

到此這篇關(guān)于jdk線(xiàn)程池的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)jdk線(xiàn)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    這篇文章主要介紹了Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java?Lambda表達(dá)式語(yǔ)法及用法示例

    Java?Lambda表達(dá)式語(yǔ)法及用法示例

    這篇文章主要給大家介紹了關(guān)于Java?Lambda表達(dá)式語(yǔ)法及用法的相關(guān)資料,lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的"函數(shù)式編程",文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹

    Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹

    這篇文章主要介紹了Java中使用Preconditions來(lái)檢查傳入?yún)?shù)介紹,本文只是作為一個(gè)簡(jiǎn)單的用法介紹,需要的朋友可以參考下
    2015-06-06
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • idea插件開(kāi)發(fā)之彈出框的示例代碼

    idea插件開(kāi)發(fā)之彈出框的示例代碼

    這篇文章主要介紹了idea插件開(kāi)發(fā)之彈出框的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java中字符串String常用方法詳解

    Java中字符串String常用方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中字符串String常用方法的相關(guān)資料,String表示字符串類(lèi)型,是引用數(shù)據(jù)類(lèi)型不是基本數(shù)據(jù)類(lèi)型,String是類(lèi)且是最終類(lèi),不能有子類(lèi),文中將用法介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享

    使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享

    這篇文章主要為大家詳細(xì)介紹了如何使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java中一個(gè)線(xiàn)程執(zhí)行死循環(huán)有什么后果

    Java中一個(gè)線(xiàn)程執(zhí)行死循環(huán)有什么后果

    這篇文章主要為大家詳細(xì)介紹了Java中一個(gè)線(xiàn)程執(zhí)行死循環(huán)有什么后果,當(dāng)一個(gè)線(xiàn)程在執(zhí)行死循環(huán)時(shí)會(huì)影響另外一個(gè)線(xiàn)程嗎,下面為大家揭曉
    2016-05-05
  • 解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題

    解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題

    這篇文章主要介紹了解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    這篇文章主要給大家介紹了利用Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例,本文生成的是GIF格式 + 干擾元素,讓驗(yàn)證碼破解難度又上了一個(gè)層次,文中給出了詳細(xì)的示例代碼,并在文末給出了完整的實(shí)例代碼供大家下載學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-04-04

最新評(píng)論

灌云县| 依安县| 柞水县| 开远市| 忻城县| 兖州市| 自治县| 安康市| 岳池县| 汝州市| 霍州市| 体育| 凤台县| 平利县| 册亨县| 花莲市| 昌图县| 灌阳县| 邢台市| 固安县| 元氏县| 府谷县| 彭泽县| 华亭县| 波密县| 永嘉县| 新蔡县| 安平县| 冷水江市| 武陟县| 武平县| 株洲县| 冕宁县| 广西| 铜陵市| 井陉县| 牙克石市| 南川市| 巨鹿县| 阜新| 长沙县|