java的线程池

一、线程池概念
若不使用线程池,在新创建的线程start()后执行完run()就自动销毁了,造成了资源的浪费。使用线程池可以暂时存储线程。
线程池的主要核心原理:
在这里插入图片描述
线程池的代码实现:
在这里插入图片描述
注意:在实际开发中线程池并不会关闭,例如服务器要24小时接收用户的访问请求。
在这里插入图片描述
例如,定义实现Runnable接口的类设置任务:
在这里插入图片描述
使用线程池:
在这里插入图片描述
可以看到不同线程执行不同MyRunnable对象的任务。
而改写代码,增长线程的逐次提交的时间,会发现同一个线程连续执行不同MyRunnable对象的任务:
在这里插入图片描述
在这里插入图片描述
二、使用ThreadPoolExecutor自定义线程池(方便修改)
ThreadPoolExecutor线程池的几个核心元素:
核心线程数量,线程池中最大线程数量、空闲时间(值)、空闲时间(单位)、阻塞队列、创建线程的方式、要执行的任务过多时的解决方案。
例如,自定义一个线程池,核心线程有3个,临时线程有3个,阻塞队列长度为3。当有5个任务提交时,线程池现创建3个线程执行前3个任务,后2个任务在阻塞队列中排队等待;当有8个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建2个临时线程取处理任务7和任务8。所有,只有当核心线程都在工作,阻塞队列被占满时才会创建临时线程。当有10个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建3个临时线程取处理任务7、8、9,任务10会触发任务拒绝策略。java中有四个任务的拒绝策略,知道第一种即可。
在这里插入图片描述

   ThreadPoolExecutor pool = new ThreadPoolExecutor(
                         3,//核心线程数量,能小于0
                         6,//最大线程数量,不能小于0,大于等于核心线程数量
                        60,//空闲线程最大存活时间
                        TimeUnit.SECONDS,//时间单位,这里为秒
                            new ArrayBlockingQueue<>(3),//阻塞队列,不能为null
                            Executors.defaultThreadFactory(),//创建线程工厂,不能为null
                            new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略,不能为null
                    );

补充线程池大小的选择
最大并行数:与电脑的CPU型号有关。
在这里插入图片描述
上图中的电脑为4核8线程。
4核8线程可以理解为CPU有4个大脑,能同时做4件事情,而Intel采用超线程技术,将4个大脑虚拟成8个,能同时做8件事,此时最大并行数为8。
注意:极少数操作系统不会把所有的内核给一个软件,所以从任务管理器中查看并不一定对,可以利用如下代码查看;
在这里插入图片描述
程序分为两种,一种是CPU密集型运算,另一种是I/O密集型运算。若是CPU密集型运算,线程池大小= 最大并行数+1;若是I/O密集型运算(读取本地文件或数据库操作较多),线程池大小= 最大并行数 X 期望 CPU利用率X总时间/CPU计算时间,其中总时间=CPU计算时间+等待时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值