前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大厂面试必会线程池ThreadPoolExecutor

大厂面试必会线程池ThreadPoolExecutor

作者头像
用户6055494
发布2019-08-28 15:27:49
5300
发布2019-08-28 15:27:49
举报
文章被收录于专栏:AVAJAVAJAVAJ

线程池呀

线程池及其各参数

我们是谁?

程序员!

我们要什么?

不知道!

什么时候要?

现在要!

ThreadPoolExecutor是用来处理异步任务的接口,可以将其理解为一个线程池和一个任务队列。 下面给出其构造方法。当大小达到coreSize后任务会被放入队列,队列满之后就会创建新的线程,直到达到maximumPoolSize。

    public ThreadPoolExecutor(int corePoolSize, // 核心线程数
                              int maximumPoolSize, // 池内最大线程数
                              long keepAliveTime, // 超过核心线程数的线程会被终止的等待时间
                              TimeUnit unit, // keepAliveTime 的时间单位
                              BlockingQueue<Runnable> workQueue, // 任务队列
                              ThreadFactory threadFactory) { // 创建线程的工厂对象
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             threadFactory, defaultHandler);
    }

通过改变ThreadPoolExecutor的构造方法的参数,这样我们就可以构造各种我么你想要的线程池,常见的有以下三种。

1.FixedThreadPool-线程池大小固定 队列无界以下代码核心线程数和最大线程数是设置成相同数值,任务队列是没有限制大小的。当现场数达到nThreads时,新的任务会被加入到队列中。缺点:队列数量没有限制,容易造成内存问题。

 public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                 0L, TimeUnit.MILLISECONDS,
                                 new LinkedBlockingQueue<Runnable>());
}

2.SingleThreadExecutor-线程池大小为1 任务队列无界 线程数和核心线程数都是1,外部使用FinalizableDelegated ExecutorService类进行了包装,主要是防止动态修改线程数量功能。由于是单线程,一旦有异常,将重新开启一个线程进行工作。缺点:任务队列无界,容易造成内存问题。

public static ExecutorService newSingleThreadExecutor() {
       return new FinalizableDelegatedExecutorService
           (new ThreadPoolExecutor(1, 1,
                                   0L, TimeUnit.MILLISECONDS,
                                   new LinkedBlockingQueue<Runnable>()));
}

3.CachedThreadPool - 线程池无限大,等待队列为1

SynchronousQueue是一个只有1个元素的队列,当有多个任务来时就开始创建线程,且60秒没接到任务的线程就会终止。

public static ExecutorService newCachedThreadPool() {
       return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                     60L, TimeUnit.SECONDS,
                                     new SynchronousQueue<Runnable>());
 }

4.自定义队列大小及拒接策略,在传入队列参数的时候可以指定队列大小,以及再传入拒接策。RejectedExecutionHandler 就是拒绝策略,我们可以写一个它的实现然后传入,这样就可以实现自己的拒绝策略啦。

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                    BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), handler);
    }
// RejectedExecutionHandler 默认实现
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
         throw new RejectedExecutionException("Task " + r.toString() +
                                               " rejected from " +
                                               e.toString());
        }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档