创建线程池

一、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() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        //新策略:打印日志,重新执行,存入新的队列等
    }
};

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值