线程池

线程池的七大参数:

(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来创建线程池,这样可以明确 规定线程池的参数,避免资源的耗尽。

posted @   程序员_YHB  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示