问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ThreadPoolExcutor用法详解

发布网友 发布时间:2022-10-13 16:41

我来回答

1个回答

热心网友 时间:2023-11-06 07:34

java线程池用法举例:

1、ThreadPoolExecutor executor =new ThreadPoolExecutor(2,10,30, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100));

2、ThreadPoolExecutor executor2 =new ThreadPoolExecutor(2,10,30, TimeUnit.SECONDS,new LinkedBlockingDeque<>());

知道了各个参数的作用后,我们开始构造符合我们期待的线程池。首先看JDK给我们预定义的几种线程池:

一、预定义线程池

FixedThreadPool

publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,newLinkedBlockingQueue());    }

corePoolSize与maximumPoolSize相等,即其线程全为核心线程,是一个固定大小的线程池,是其优势;

keepAliveTime = 0 该参数默认对核心线程无效,而FixedThreadPool全部为核心线程;

workQueue 为LinkedBlockingQueue(无界阻塞队列),队列最大值为Integer.MAX_VALUE。如果任务提交速度持续大余任务处理速度,会造成队列大量阻塞。因为队列很大,很有可能在拒绝策略前,内存溢出。是其劣势;

FixedThreadPool的任务执行是无序的;

适用场景:可用于Web服务瞬时削峰,但需注意长时间持续高峰情况造成的队列阻塞。

CachedThreadPool

publicstaticExecutorServicenewCachedThreadPool(){returnnewThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,newSynchronousQueue());    }

corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,即线程数量几乎无*;

keepAliveTime = 60s,线程空闲60s后自动结束。

workQueue 为 SynchronousQueue 同步队列,这个队列类似于一个接力棒,入队出队必须同时传递,因为CachedThreadPool线程创建无*,不会有队列等待,所以使用SynchronousQueue;

适用场景:快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。

SingleThreadExecutor

publicstaticExecutorServicenewSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService            (newThreadPoolExecutor(1,1,0L, TimeUnit.MILLISECONDS,newLinkedBlockingQueue()));    }

咋一瞅,不就是newFixedThreadPool(1)吗?定眼一看,这里多了一层FinalizableDelegatedExecutorService包装,这一层有什么用呢,写个dome来解释一下:

publicstaticvoidmain(String[] args){        ExecutorService fixedExecutorService = Executors.newFixedThreadPool(1);        ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) fixedExecutorService;        System.out.println(threadPoolExecutor.getMaximumPoolSize());        threadPoolExecutor.setCorePoolSize(8);                ExecutorService singleExecutorService = Executors.newSingleThreadExecutor();//      运行时异常 java.lang.ClassCastException//      ThreadPoolExecutor threadPoolExecutor2 = (ThreadPoolExecutor) singleExecutorService;}

对比可以看出,FixedThreadPool可以向下转型为ThreadPoolExecutor,并对其线程池进行配置,而SingleThreadExecutor被包装后,无法成功向下转型。 因此,SingleThreadExecutor被定以后,无法修改,做到了真正的Single。

ScheledThreadPool

publicstaticScheledExecutorServicenewScheledThreadPool(intcorePoolSize){returnnewScheledThreadPoolExecutor(corePoolSize);    }

newScheledThreadPool调用的是ScheledThreadPoolExecutor的构造方法,而ScheledThreadPoolExecutor继承了ThreadPoolExecutor,构造是还是调用了其父类的构造方法。

publicScheledThreadPoolExecutor(intcorePoolSize){super(corePoolSize, Integer.MAX_VALUE,0, NANOSECONDS,newDelayedWorkQueue());    }

二、自定义线程池
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
艾芙洛洗发水为什么不在商场销售商 艾芙洛洗发水是英国的吗 毕业生刚刚签了三方协议,想毁,怎么办 适合夫妻干的生意有哪些 新生蜜蜂多久出巢试飞 新生蜜蜂什么时候进行首次试飞? 蜜蜂几月几日出生外貌和颜色? 当脚模一定要脚趾修长吗 脚长成这样,能当脚膜吗 固话遇忙记存呼叫业务有什么特点? 什么是固话遇忙记存呼叫业务? Spring Boot中异步线程池@Async详解 求凯莉小说全集 促销商品英语怎么说啊 在平面地球仪上怎样辨别中午子夜等 我嫁给有钱老公,每个月有三万零花钱,可我就像是被囚禁了一样,怎么办? 北大陈静雯是哪一年的高考状元 苹果笔记本安装系统需要对照美国时间吗 重庆市南岸区融侨半岛云满庭C区 英文翻译,谢谢哪位仁兄帮忙 大学毕业季离别文案 汉中有没有通信管理局?拜托各位大神 教师节主题征文:我心目中的好老师? 我心中的好老师征文(小学组) 我心目中的老师话题作文 第33个教师节主题征文:我心目中的好老师? 教师节我心目中的好老师征文 教师节作文:我心目中的老师 大众新polo节气门怎么清洗,新polo节气门清洗方法 切除胆囊后可食红豆,花生,红薯糖水吗? 胆囊摘除15天后可以吃地瓜和紫薯吗? 腹腔镜手术切除胆囊20天能吃地瓜吗? pthread_create ——我与华为线程的争斗 Elasticsearch(3台master和3台data)配置文件详解 ElasticSearch查询流程详解 七年级数学上学期期中测试卷子与答案 七年级数学期中试卷 there are many snakes in Australia这个俚语什么意思,那位高手和我讲一下? 网络赌博银行卡被冻结里面的钱能拿出来吗 金融是一国的经济命脉吗 求一部BL漫画,攻是一只豹子,受是人。受在草原拍攻的照片,攻很难被拍到。一个月吧受想着这次总能拍到 二年级养蚕日记 孩子玩耍时总是变成“泥娃娃”,为何这类孩子如此偏爱玩泥呢? 孩子爱玩泥巴怎么办? 漳平市动物卫生监督所在哪里? 漳平金色华城在哪里 漳平凯源哪里有古筝琴行 Intel平台最好的整合主板是什么(显卡最好)? 步步惊心的女主角若曦的真是性名是什么? 《*荣誉》开播啦,这部剧的演员阵容如何?能否在*题材电视剧破圈呢? 凤梨和菠萝实则上就是一种水果中的不同品种,凤梨是不是菠萝? 狼的翻译及字词解释ppt