[送书] Java 线程池 ThreadPoolExecutor 相关题目解析

Posted 码农每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[送书] Java 线程池 ThreadPoolExecutor 相关题目解析相关的知识,希望对你有一定的参考价值。

码农每日一题
长按关注,工作日每天分享一个技术知识点。
[送书] Java 线程池 ThreadPoolExecutor 相关题目解析

[送书] Java 线程池 ThreadPoolExecutor 相关题目解析[送书] Java 线程池 ThreadPoolExecutor 相关题目解析本月第三次送书活动,今日送出的两本技术书和规则详见文章末尾,明日持续有其他新的送书活动~


问:谈谈你对 java 线程池 ThreadPoolExecutor 与 ScheduledThreadPoolExecutor 的理解及相关构造参数的含义?


答:线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成;ThreadPoolExecutor 继承自 AbstractExecutorService 实现了 ExecutorService 接口,ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor 实现了 ExecutorService 和 ScheduledExecutorService 接口;ThreadPoolExecutor 有一些重要的参数来控制我们合理的使用线程池,所以我们有必要看下这些参数的含义:

    
      
      
    
  1. //有多个构造方法,最终都指向这个最多参数的构造方法

  2. public ThreadPoolExecutor(int corePoolSize,

  3.                              int maximumPoolSize,

  4.                              long keepAliveTime,

  5.                              TimeUnit unit,

  6.                              BlockingQueue<Runnable> workQueue,

  7.                              ThreadFactory threadFactory,

  8.                              RejectedExecutionHandler handler) {...}

  • corePoolSize:核心运行的线程个数,也就是当超过这个范围的时候就需要将新的异步任务放入到等待队列中,小于这个数时添加进来的异步任务一般直接新建 Thread 执行;

  • maximumPoolSize:最大线程个数,当大于了这个值就会将准备新加的异步任务由一个丢弃处理机制来处理,大于 corePoolSize 且小于 maximumPoolSize 则新建 Thread 执行,但是当通过 newFixedThreadPool 创建的时候,corePoolSize 和 maximumPoolSize 是一样的,而 corePoolSize 是先执行的,所以他会先被放入等待队列而不会执行到下面的丢弃处理中;

  • workQueue:任务等待队列,当达到 corePoolSize 的时候就向该等待队列放入线程信息(默认为一个LinkedBlockingQueue);

  • keepAliveTime:默认是 0,当线程没有任务处理后空闲线程保持多长时间,不推荐使用;

  • threadFactory:是构造 Thread 的方法,一个接口类,可以使用默认的 default 实现,也可以自己去包装和传递,主要实现 newThread 方法即可;

  • handler:当参数 maximumPoolSize 达到后丢弃处理的方法实现,java 提供了 5 种丢弃处理的方法,当然你也可以自己弄,主要是要实现接口 RejectedExecutionHandler 中 rejectedExecution(Runnabler, ThreadPoolExecutor e) 方法,java 默认使用的是 AbortPolicy,他的作用是当出现这种情况的时候抛出一个异常;

通常得到线程池后会调用其中的 submit 或 execute 方法去提交执行异步任务,其实 submit 方法最终会调用 execute 方法来进行操作,只是他提供了一个 Future 来托管返回值的处理而已,当你调用需要有返回值的信息时用它来处理是比较好的,这个 Future 会包装 Callable 信息。

ScheduledThreadPoolExecutor 是基于 ThreadPoolExecutor 实现的,其调用线程池的构造使用了 DelayedWorkQueue 阻塞队列实现而已。

一般性的需求推荐通过 Executors 工厂类创建线程池,其对 ThreadPoolExecutor 已经做了合适的封装,很方便使用。


深入感兴趣的可以查看如下文章:

ThreadPoolExecutor的原理》http://blog.csdn.net/u010723709/article/details/50372322

《线程池源码分析ThreadPoolExecutor》https://yq.aliyun.com/articles/39090

[送书] Java 线程池 ThreadPoolExecutor 相关题目解析

[送书] Java 线程池 ThreadPoolExecutor 相关题目解析

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

《》

[送书] Java 线程池 ThreadPoolExecutor 相关题目解析看完不过瘾?看完还想看?那就点击本号历史经典技术知识点题目推送,解锁更多基础知识~


[送书] Java 线程池 ThreadPoolExecutor 相关题目解析[送书] Java 线程池 ThreadPoolExecutor 相关题目解析[送书] Java 线程池 ThreadPoolExecutor 相关题目解析今日送出书籍为《Spring MVC+MyBatis开发从入门到项目实战》,总共送出两本,分别送给评论点赞数最多的前两名,中奖数据统计截至时间为 2018 年 3 月 28 日(星期三)晚上九点整,中奖的小伙伴请主动联系小编,否则统计时间截至 12 小时后顺延其他名次兑换

[送书] Java 线程池 ThreadPoolExecutor 相关题目解析

没抽到且还想要的小伙伴可以选择自己买一本学习咯,购买直达链接可以直接点击左下角阅读原文

以上是关于[送书] Java 线程池 ThreadPoolExecutor 相关题目解析的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程系列--“JUC线程池”02之 线程池原理

线程池没你想象的那么简单丨文末送书

使用线程池进行爬虫

线程池的理解

线程池ScheduledExecutorService使用

高并发通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程