Java线程池相关最佳实践

普通实现线程可以通过继承Thread类,实现Runnable、Callab接口,但是通过这种方式创建的线程使用完毕就会被销毁,频繁的创建和销毁线程非常耗费系统资源;

所以我们需要线程池,对线程资源进行复用
JDK提供了ThreadPoolExecutor线程池
Spring提供了ThreadPoolTaskExecutor线程池
这两个线程池的核心参数

corePoolSize:核心线程数;即使没有任务也会存活的线程,每次有任务到来,即使有空闲线程但是数目没到核心线程数目,那么也会新创建线程去执行任务;可以设置等待超时关闭
maxPoolSize:最大线程数目,如果核心线程都在忙,但是又有任务到来就会新建不大于最大线程池数目的线程;如果最大线程池已满,那么任务到来将会进入等待队列
queueCapacity:等待队列的容量
keepAliveSeconds:线程等待关闭时间
allowCoreThreadTimeOut:核心线程是否可以等待超时就关闭

执行策略

线程数小于核心线程数,会一直创建线程,知道线程数等于核心线程数
线程数等于核心线程数目,新加入的任务会直接进入等待队列
等待队列已满,新建不大于最大线程数的线程
等待队列已满;且线程数目等于最大线程数目;如果仍有任务到达,执行拒绝策略
线程池的实践
要合理配置的前提是对该线程池所需处理的任务进行分析
任务的性质:CPU密集型任务、IO密集型任务、混合型任务
任务的优先级:高、中、低
任务的执行时间:长、中、短
任务的依赖性:是否依赖其他系统资源,如数据库连接等
性质不同的任务可以交给不同规模的线程池执行
CPU密集型的任务:尽可能少的线程,如CPU个数+1
IO密集型的任务:尽可能多的线程,因为IO不占用CPU,如两倍CPU核心+1
混合型的任务应该拆分为IO密集和CPU密集型的任务分别处理
如果任务对其他系统资源有依赖,譬如需要花费较多时间等待数据库连接,那么CPU空闲的时间会较多,那么应该多分配一点线程数目,这样才能更好的利用CPU

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

总结:线程等待时间越久,那么需要更多的线程数目;线程占用CPU的时间越长,那么需要更少的线程数目

在SpringBoot中执行异步任务

使用@Async注解,这样会从你配置的相关线程池取得资源;注意这个注解标注的方法返回值只能是void或者future

关于如何设置的详解->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值