线程池"/>
创建线程池
一、Executors创建
(1)通用线程池:newCachedThreadPool();
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
1.线程数无限制
2.有空闲线程则复用空闲线程,若无空闲线程则新建线程
3.一定程度减少频繁创建/销毁线程,减少系统开销
(2)定长线程池:newFixedThreadPool(int corePoolSize);
ExecutorService fixedThreadPool =
Executors.newFixedThreadPool(int corePoolSize);
1.可控制线程最大并发数(同时执行的线程数 n )
2.超出的线程会在队列中等待
(3)定长定时线程池:newScheduledTreadPool(int corePoolsize);
ScheduledExecutorService scheduledThreadPool =
Executors.newScheduledThreadPool(int corePoolSize);
1.可控制线程最大并发数(同时执行的线程数)
2.超出的线程会在队列中等待
3.支持定时及周期性任务执行 schedule方法 (Runnable runnable , int t , TimeUnit timeunit)
(4)单线程线程池:newSingleThreadExecutor();
ExecutorService SingleThreadExecutor = Executors.newSingleThreadExecutor();
1.有且仅有一个工作线程执行任务
2.所有任务按照指定顺序执行,即遵循队列的入队出队规则
(5)单线程定时线程池:newSingleThreadScheduledExecutor();
ScheduledExecutorService SingleThreadScheduledExecutor =
Executors.newSingleThreadScheduledExecutor();
1.有且仅有一个工作线程执行任务
2.所有任务按照指定顺序执行,即遵循队列的入队出队规则
3.支持定时及周期性任务执行 schedule方法 (Runnable runnable , int t , TimeUnit timeunit)
二、自定义创建线程池
ThreadPoolExecutor的参数说明
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
corePoolSize:核心线程数
maximumPoolSize:线程池中的最大线程数
keepAliveTime:超过核心线程且少于最大线程的线程的存活时间,过时间回收线程。
unit:参数keepAliveTime的时间单位,共7种取值,在TimeUtil中定义 hours,minutes,seconds等
workQueue:阻塞队列 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到该队列当中
threadFactory:线程工厂,可以不指定。默认会调用Executors.defaultThreadFactory()创建默认工厂
handler:拒绝执行策略。阻塞队列满且超过最大线程数后
四种拒绝策略+自定义拒绝策略
RejectedExecutionHandler handler =
new ThreadPoolExecutor.AbortPolicy();
AbortPolicy: 丢掉线程后抛异常
(Exception in thread "xxxx"java.util.concurrent.RejectedExecutionException)
DiscardPolicy: 丢掉最后提交的线程
DiscardOldestPolicy: 丢掉最早提交的线程
CallerRunsPolicy: 由交给你该线程的线程执行
自定义需要实现接口RejectedExecutionHandler
RejectedExecutionHandler handler = new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {//新策略:打印日志,重新执行,存入新的队列等}
};
更多推荐
创建线程池
发布评论