线程池
- 线程的创建销毁会伴随着系统开销,影响效率
- 线程并发数量过多,抢占资源导致系统阻塞
- 对线程进行管理
创建线程池的方式
//五个参数的构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
//六个参数的构造函数-1
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
//六个参数的构造函数-2
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
//七个参数的构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- int corePoolSize
核心线程数
- int maximumPoolSize
最大线程数
- keepAliveTime
非核心线程的超时时长,如果设置allowCoreThreadTimeOut = true ,核心线程也会遵循这个超时时间
- TimeUnit unit
超时时间单位:
NANOSECONDS : 1微毫秒 = 1微秒 / 1000
MICROSECONDS : 1微秒 = 1毫秒 / 1000
MILLISECONDS : 1毫秒 = 1秒 /1000
SECONDS : 秒
MINUTES : 分
HOURS : 小时
DAYS : 天
- BlockingQueue<Runnable> workQueue
存放等待执行的Runnable,如果所有核心线程都在执行,新任务会放在队列里,如果队列满了,创建非核心线程执行任务。
1、 SynchronousQueue 队列中的任务直接交给线程处理,不保留
2、 LinkedBlockingQueue 当前线程数小于核心线程,新建一个线程来执行任务,等于核心线程数,将任务放入队列中
3、ArrayBlockingQueue 指定队列长度。如果当前线程数超过核心线程数,创建非核心线程数,当队列和maximumPoolSize都满了,发生错误
4、DelayQueue 队列中元素实现Delayed接口,达到了指定延时时间执行任务
- ThreadFactory threadFactory
对创建的线程可以起别名
- RejectedExecutionHandler handler
线程拒绝策略,针对队列中线程满的情况
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
ThreadPoolExecutor的策略
1、线程数没有到corePoolSize,新建一个核心线程执行任务
2、线程数达到了corePoolSize,将任务放在队列中
3、队列满了,新建非核心线程处理
4、队列满了,总线程数达到了maximumPoolSize,由RejectedExecutorHandler处理。
最后
线程池不建议使用Executors创建,使用ThreadPoolExecutor创建,Executors创建线程的弊端:newCacheThreadPool允许最大线程数Integer.MAX_VALUE、newFixedThreadPool和newSingleThreadPool允许的最大队列Integer.MAX_VALUE这些都是会造成OOM。
网友评论