java 线程池总结

线程池
1、分类
1)、固定线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);

2)、一个线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();

3)、根据需要创建线程的线程池,没有核心线程池。每次
ExecutorService executorService = Executors.newCachedThreadPool();

这三个都是用 ThreadPoolExecutor   实现的。创建ThreadPoolExecutor 主要参数有:
int corePoolSize 核心线程池大小,这个线程是一直存活的,不会销毁
int maximumPoolSize 最大线程池大小,如果核心线程用完了,再有任务时会创建一个线程,所有的线程总数不能大于这个数。
long keepAliveTime      大于核心线程数线程,空闲的存活时间
TimeUnit unit           keepAliveTime 时间单位
BlockingQueue<Runnable> workQueue   存放线程的队列,当没有多余的线程来执行线程时存放线程
ThreadFactory threadFactory 线程工厂,用来创建工作线程
RejectedExecutionHandler handler    拒绝策略,当线程队列存放满时再提交任务线程时处理方法。

拒绝策略都是实现 RejectedExecutionHandler,默认有4个实现,都是ThreadPoolExecutor 内部类。

AbortPolicy 抛出异常,实现:直接抛出异常

CallerRunsPolicy 在提交任务的线程中执行,实现:在调用任务的run() 方法

DiscardOldestPolicy 把等待时间最长的任务丢弃, 实现:获取等待队列,然后poll()

DiscardPolicy 丢弃提交的任务, 实现:实现方法为空,什么也不做。

可以自己 实现 RejectedExecutionHandler 接口,从而实现自己定义的拒绝策略



4)、CachedThreadPool是一个会根据需要创建新线程的线程池。
ExecutorService executor = Executors.newCachedThreadPool();

CachedThreadPool使用没有容量的SynchronousQueue作为线程池的工作队列,但CachedThreadPool的maximumPool是无界的。这意味着,如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程。极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。

4)、调度线程池 ScheduledThreadPoolExecutor  是ThreadPoolExecutor 的子类

主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。

定义:
class ScheduledThreadPoolExecutor 
        extends ThreadPoolExecutor
        implements ScheduledExecutorService

创建:
ScheduledThreadPoolExecutor ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);

使用的队列是:DelayedWorkQueue,就是使用DelayQueue封装了一个PriorityQueue,这个PriorityQueue会对队列中的ScheduledFutureTask进行排序。排序时,time小的排在前面(时间早的任务将被先执行)。如果两个ScheduledFutureTask的time相同,就比较sequenceNumber,sequenceNumber小的排在前面(也就是说,如果两个任务的执行时间相同,那么先提交的任务将被先执行)。

2、阻塞队列
ArrayBlockingQueue 数组构成的有界阻塞队列
LinkedBlockingQueue 链表组成的有界阻塞队列
PriorityBlockingQueue 支持优先级排序的无界阻塞队列
DelayQueue 使用优先级队列实现的无界阻塞队列
SynchronousQueue 不存储元素的阻塞队列
LinkedTransferQueue     链表组成的无界阻塞队列
LinkedBlockingDeque 链表组成的双向阻塞队列

3、拒绝策略
AbortPolicy 直接抛出异常,默认策略。
CallerRunsPolicy 使用调用都的线程来运行任务线程
DiscardOldestPolicy 丢弃队列中最老的没有执行的一个任务,然后执行executor 执行提交的任务
DiscardPolicy       直接丢弃提交的任务

这几个拒绝策略都是 ThreadPoolExecutor  内部类,源码很简单。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值