美文网首页线程池
ThreadPoolExcutor线程池

ThreadPoolExcutor线程池

作者: IT菜鸟学习 | 来源:发表于2018-10-09 15:58 被阅读0次

Executors方法创建自带线程池

线程池不建议使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors各个方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
  主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
2)newCachedThreadPool和newScheduledThreadPool:
  主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。

ThreadPoolExecutor的构造方法如下:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

其中:

  1. corePoolSize: 核心池的大小。 当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中

  2. maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能创建多少个线程;

  3. keepAliveTime: 表示线程没有任务执行时最多保持多久时间会终止。

  4. unit: 参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:

  5. workQueue: 一个阻塞队列,用来存储等待执行的任务。 一般来说,这里的阻塞队列有以下几种选择:

ArrayBlockingQueue;  
LinkedBlockingQueue;  
SynchronousQueue
  1. threadFactory: 线程工厂,主要用来创建线程;
  2. handler: 表示当拒绝处理任务时的策略,有以下四种取值:
    ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
    ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
    ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
    ThreadPoolExecutor.CallerRunsPolicy:只要线程池不关闭,该策略直接在调用者线程中,运行当前被丢弃的任务
    个人认为这4中策略不友好,最好自己定义拒绝策略,实现RejectedExecutionHandler接口

2. Java里的阻塞队列

JDK7提供了7个阻塞队列。分别是

  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

LinkedBlockingQueue是一个用链表实现的有界阻塞队列。此队列的默认和最大长度为Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行排序。

转自:https://blog.csdn.net/kusedexingfu/article/details/72491864
http://www.infoq.com/cn/articles/java-blocking-queue

相关文章

  • ThreadPoolExcutor线程池

    Executors方法创建自带线程池 线程池不建议使用Executors去创建,而是通过ThreadPoolExe...

  • Java线程池ThreadPoolExcutor

    1.线程池的工作原理: 1.1线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任...

  • Java线程池ThreadPoolExcutor

    线程池的存在 Java中的线程池是对线程开销资源的管理,以及解决线程并发的一套框架。在开发过程中可以带来以下好处:...

  • 阿里的面试题带你认识ForkJoinPool

    我相信大家都用过线程池,比如ExcutorService,比如ThreadPoolExcutor今天来讲讲Fork...

  • 2021 JAVA面试题精选

    手动整理不易,持续更新 详细描述ThreadPoolExcutor各个参数的含义,介绍一个任务提交到线程池后的执行...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • ThreadPoolExecutor源码历险-位运算技巧

    我体会到的ThreadPoolExcutor的源码阅读可分为几部分 1.ThreadPoolExcutor构造函数...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • Spring Boot之ThreadPoolTaskExecut

    初始化线程池 corePoolSize 线程池维护线程的最少数量keepAliveSeconds 线程池维护线程...

网友评论

    本文标题:ThreadPoolExcutor线程池

    本文链接:https://www.haomeiwen.com/subject/ygoeaftx.html