java面试系列---线程池

目录

 

线程池的优势

ThreadPoorExecutor参数含义

线程池的工作原理:

四大拒绝策略

工作中怎么创建线程池:

合理配置线程池线程数?


线程池的优势

特点:线程复用,控制最大并发数,管理线程。

ThreadPoorExecutor参数含义

coreThreadSize:核心线程池,线程池中固定线程数。

maxmumThreadSize:线程池中能够创建的最大线程数。

workQueue:阻塞队列,当任务数量大于核心线程数时,任务会放到阻塞队列中。

keepAliveTime:当阻塞队列中的任务数处理完后,临时线程距离销毁的时间。

Unit: keepAliveTime的空闲时间。

ThreadFactory:创建线程的工厂,一般为默认。

RejectHandle:拒绝策略。

线程池的工作原理:

当任务数小于核心线程数时,由核心线程处理。

当并发大于核心线程数时,大于核心线程数的请求任务将会加入阻塞队列,

如果阻塞队列也满了则会开启创建最大线程数,

如果最大线程数也满了,就会执行拒绝策略。

四大拒绝策略

AbordPolicy(默认策略):当超过最大线程数最接抛出异常(一般生产不用)。

CallerRunPolicy:调用者运行策略,超过最大线程数,就会将超出的任务回退给调用者。

discardOldsPolicy:抛弃队列中等待最久的任务,将当前任务加入队列中尝试再次提交当前任务。

discardPolicy::直接抛弃任务,不做任何处理,也不抛出异常,如果允许丢失这是一种最好的策略。

工作中怎么创建线程池:

阿里为什么不推荐使用Excutors创建线程(阿里手册)使用executors创建线程池返回对象的弊端?

1)FixedThreadPool和SingleThreadPool

允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

2)CachedThreadPool和ScheduledThredPool

允许的创建的线程的数量为Integer.MAX_VALUE, 可能会创建大量的线程,从而导致OOM。

工作中都是通过New ThreadPoorExcuter()自定义创建线程池,创建成有界队列。

合理配置线程池线程数?

合理配置线程池线程池中最大线程数是多少?怎么设置的?

首先获取硬件的cpu核心线程数:

Runtime.getRuntime().availableProcessors();

配置线程池分两种情况

第一种是CPU密集型的

假如CPU是8核,配高一个(即最大线程数为9),减少cpu的切换。

第二种是IO密集型

公式一:CPU核数*2

公式二:CPU核数/(1-0.9)阻塞系数是0.8~0.9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值