线程池的七大参数:
(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来创建线程池,这样可以明确 规定线程池的参数,避免资源的耗尽。
标签:场景,get,创建,任务,线程,执行 From: https://www.cnblogs.com/yhb-blogs/p/17439171.html