毫无悬念 , 这就是最后一种方式 , 也是其他实现方式的基础 。而用这种方式也是最容易控制 , 因为我们可以自由的设置参数 。在阿里巴巴开发手册中也提到了

文章插图
所以我们更需要去了解这七大参数 , 在平时用线程池的时候尽量去用ThreadPoolExecutor 。而关于这七大参数我们简单概括就是
- corePoolSize: 线程池核心线程个数
- workQueue: 用于保存等待执行任务的阻塞队列
- maximunPoolSize: 线程池最大线程数量
- ThreadFactory: 创建线程的工厂
- RejectedExecutionHandler: 队列满 , 并且线程达到最大线程数量的时候 , 对新任务的处理策略
- keeyAliveTime: 空闲线程存活时间
- TimeUnit: 存活时间单位
- CPU密集型
获得cpu的核数 , 不同的硬件不一样,设置核数的的线程数量 。
我们可以通过代码Runtime.getRuntime().availableProcessors();获取 , 然后设置 。 - IO密集型
IO非常消耗资源 , 所以我们需要计算大型的IO程序任务有多少个 。
一般来说 , 线程池最大值 > 大型任务的数量即可
一般设置大型任务的数量*2

文章插图
我们一共有五个柜台 , 可以理解为线程池的最大线程数量 , 而其中有两个是在营业中 , 可以理解为线程池核心线程个数 。而下面的等待厅可以理解为用于保存等待执行任务的阻塞队列 。银行就是创建线程的工厂 。而关于空闲线程存活时间 , 我们可以理解为如图1.1这种情况 , 当五个营业中 , 却只有两个人需要被服务 , 而其他三个人一直处于等待的情况下 , 等了一个小时了 , 他们被通知下班了 。这一个小时时间就可以说是空闲线程存活时间 , 而存活时间单位 , 顾名思义 。

文章插图
到现在我们就剩一个拒绝策略还没介绍 , 什么是拒绝策略呢?我们可以假设当银行五个柜台都有人在被服务 , 如图1.2 。而等待厅这个时候也是充满了人 , 银行实在容不下人了 。

文章插图
这个时候对银行外面那个等待的人的处理策略就是拒绝策略 。我们同样了解之后用代码来测试一下:
public staticvoid test05(){ExecutorService threadPool = new ThreadPoolExecutor(//核心线程数量2,//最大线程数量5,//空闲线程存活时间3,//存活单位TimeUnit.SECONDS,//这里我们使用大多数线程池都默认使用的阻塞队列 , 并使容量为3new LinkedBlockingDeque<>(3),Executors.defaultThreadFactory(),//我们使用默认的线程池都默认用的拒绝策略new ThreadPoolExecutor.AbortPolicy());try {//对线程进行执行十条打印任务for(int i = 1; i <= 2; i++){threadPool.execute(()->{System.out.println(Thread.currentThread().getName()+"=>执行完毕!");});}} catch (Exception e) {e.printStackTrace();} finally {//用完线程池一定要记得关闭threadPool.shutdown();}}我们执行打印两条任务 , 可以发现线程池只用到了我们的核心两条线程 , 相当于只有两个人需要被服务 , 所以我们就开了两个柜台 。pool-1-thread-1=>执行完毕!pool-1-thread-2=>执行完毕!但是在我们将打印任务改到大于5的时候 , (我们改成8)我们可以发现线程池的五条线程都在使用了 , 人太多了 , 我们的银行需要都开放了来服务 。for(int i = 1; i <= 8; i++)pool-1-thread-1=>执行完毕!pool-1-thread-1=>执行完毕!pool-1-thread-1=>执行完毕!pool-1-thread-1=>执行完毕!pool-1-thread-2=>执行完毕!pool-1-thread-3=>执行完毕!pool-1-thread-4=>执行完毕!pool-1-thread-5=>执行完毕!在我们改成大于8的时候 , 可以发现拒绝策略触发了 。银行实在容纳不下了 , 所以我们把外面那个人用策略打发了 。
推荐阅读
- 什么是“进程、线程、协程”?
- 智能手机|千元级闪充旗舰 realme真我 Q5 Pro大升级电池+80W快充:33分钟充满
- 金花茶的功效与作用,详谈关于芍药花茶基本的功效与作用
- 有没有猫仙 关于猫的灵异事件真实
- 纽扣电池cr2030和cr2032通用吗,纽扣电池cr2032和cr1620可以通用吗?
- 燃料电池是通过什么产生电 微生物燃料电池的应用
- 外星人假说 关于外星人的猜想
- 关于微服务的几点老板关心问题
- 关于内存的那些知识误区盘点
- 彗星的介绍 关于彗星的资料
