一、线程池的存在意义
系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗
二、线程池的使用
2.1线程池的核心原理
创建一个池子,池子是空的
提交任务时,池子会创建线程对象,任务执行完毕,将线程归还给池子,待下一个线程使用
提交任务时,池子中没有空闲线程,也无法创建新的线程,该任务就会排队等待
2.2线程池的代码实现
1.创建线程池
2.提交任务
3.所有任务执行完毕,关闭线程
public class Test1 { public static void main(String[] args) throws InterruptedException { //创建线程池 ExecutorService pool1 = Executors.newCachedThreadPool(); //创建指定数量的线程池 ExecutorService pool2 = Executors.newFixedThreadPool(3); //提交任务 pool2.submit(new Myrunable()); pool2.submit(new Myrunable()); pool2.submit(new Myrunable()); pool2.submit(new Myrunable()); pool2.submit(new Myrunable()); //销毁线程池 pool2.shutdown(); //提交任务 pool1.submit(new Myrunable()); Thread.sleep(1000); pool1.submit(new Myrunable()); Thread.sleep(1000); pool1.submit(new Myrunable()); Thread.sleep(1000); //销毁线程池 pool1.shutdown(); }
三、自定义线程池
java把线程池封装为ThreadPoolExecutor类,利用构造方法创建线程池对象
3.1线程池的参数详解
3.2线程池的执行原理
3.3灵魂两问
一问:先提交的任务一定先被执行吗?
二问:临时线程何时创建?
答:
先提交任务不一定先执行,因为先提交的任务可能在等待队列中等待,而后提交的任务交给临时线程处理
当等待队列已满,创建临时线程
3.4线程池多大合适
CPU密集型的:最大并行数+1
I/O密集型的:最大并行数*cpu期望利用率*总时间/CPU计算时间
//获取虚拟机可获得的线程数
//我的电脑就是4核4线的
int count = Runtime.getRuntime().availableProcessors();
System.out.println(count);
3.5拒绝策略
当线程池中总线程数都在使用且等候队列也已满,触发拒绝策略
📕总结
以上就是学习线程池的相关内容,欢迎批评指正