线程池
线程池的七大参数:
(1)核心线程数。
(2)最大线程数。
(3)非核心线程存活时间。
(4)非核心线程存活时间的单位。
(5)阻塞队列。
(6)线程工厂。
(7)拒绝策略。
拒绝策略有四种:
(1)由主线程执行这个任务。
(2)丢弃任务不报错。
(3)丢弃任务报错。(默认)
(4)丢弃最先进来的任务并尝试执行当前任务。
线程池执行任务的流程:
执行execute()方法和submit()方法提交任务的区别:
-
execute()
方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否; -
submit()方法用于提交需要返回值的任务。线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用
get(long timeout,TimeUnit unit)
方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。
线程池的4种类型:
(1)newFixedThreadPool:固定线程数的线程池,核心线程和最大线程数一样,没有救急线程。
适用场景:适用于任务量已知,相对耗时的场景。
(2)newSingleThreadExecutor:创建一个单线程的线程池,核心线程和最大线程数都是1。
适用场景:适合按顺序处理任务。
(3)newCachedThreadPool:创建一个可缓存的线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE。特点:每来一个任务都会创建一个工作线程去执行任务。
适用场景:任务量比较密集,且每个任务执行时间不长。
(4)newScheduleThreadPool:支持定时以及周期性处理任务的线程池。
适用场景:有定时或周期性执行任务的场景。
线程池常用的阻塞队列:
为什么不建议使用Executors创建线程池:
其实这个事情在阿里提供的最新开发手册《Java开发手册-嵩山版》中 也提到了 主要原因是如果使用Executors创建线程池的话,它允许的请求队列默认长度 是Integer.MAX_VALUE,这样的话,有可能导致堆积大量的请求,从而导致 OOM(内存溢出)。 所以,我们一般推荐使用ThreadPoolExecutor来创建线程池,这样可以明确 规定线程池的参数,避免资源的耗尽。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了