zoukankan      html  css  js  c++  java
  • Hello ThreadPoolExecutor

    ThreadPoolExecutor创建:
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
    构造函数如下:

    参数说明:

    corePoolSize:核心线程池大小, 当新的任务到线程池后,线程池会创建新的线程(即使有空闲线程),直到核心线程池已满。

    1)maximumPoolSize:最大线程池大小,顾名思义,线程池能创建的线程的最大数目keepAliveTime:当线程数达到maximumPoolSize时,若发现超过指定时间多出的线程仍处于空闲状态,就会进行线程的回收

    1-1当正在运行的线程等于corePoolSize时,任务优先添加到队列中,当队列已满并且没有空闲线程时才创建新的线程。

    1-2若设置的corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池

    2)TimeUnit: 时间单位BlockingQueue<Runnable>:用来储存等待执行任务的队列

    3)threadFactory:线程工厂

    4)RejectedExecutionHandler: 当核心线程不能都在处理任务时,新进任务被放在Queue里

    重要参数说明:

    corePoolSize 和 maximumPoolSize

    1)默认情况下线程中的线程初始时为 0, 当有新的任务到来时才会创建新线程,当线程数目到达 corePoolSize 的数量时,新的任务会被缓存到 workQueue 队列中。

    2)如果不断有新的任务到来,队列也满了的话,线程池会再新建线程直到总的线程数目达到 maximumPoolSize。

    3)如果还有新的任务到来,则要根据 handler 对新的任务进行相应拒绝处理.

    BlockingQueue<Runnable>

    一个阻塞队列,用来存储等待执行的任务

    常用队列:

    ArrayBlockingQueue
                基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序
    LinkedBlockingQueue
                一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue.
                静态工厂方法Executors.newFixedThreadPool()使用了这个队列
    SynchronousQueue
                不存储元素的阻塞队列
                每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
                吞吐量通常要高于LinkedBlockingQueue
                注: 静态工厂方法Executors.newCachedThreadPool使用了这个队列
    PriorityBlockingQueue
                具有优先级得无限阻塞队列
        RejectedExecutionHandler
            线程池处于饱和状态时需要采取的应对策略
            jdk提供策略:
                AbortPolicy:表示无法处理新任务时抛出异常, 默认策略
                CallerRunsPolicy:用调用者所在线程来运行任务
                DiscardOldestPolicy:该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务
                DiscardPolicy:不处理,丢弃掉
                自定义策略:
                    实现 RejectedExecutionHandler 接口

      threadFactoy

    ThreadPoolExecutor是Executors类的实现,Executors类里面提供了一些静态工厂,生成一些常用的线程池,主要有以下几个:
    1) newSingleThreadExecutor:创建一个单线程的线程池。次线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
    2)newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。(相当于创建了相同corePoolSize、maximumPoolSize的线程池)
    3)newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小

    三种排队策略:

    1)直接提交。直接提交策略表示线程池不对任务进行缓存。新进任务直接提交给线程池,当线程池中没有空闲线程时,创建一个新的线程处理此任务。这种策略需要线程池具有无限增长的可能性。实现为:SynchronousQueue
    2)有界队列。当线程池中线程达到corePoolSize时,新进任务被放在队列里排队等待处理。有界队列(如ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O 边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU 使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
    3)无界队列。使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize 的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在 Web 页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性

     

  • 相关阅读:
    JZOJ 3034. 【NOIP2012模拟10.17】独立集
    JZOJ 3035. 【NOIP2012模拟10.17】铁轨
    JZOJ 1259. 牛棚安排
    数位DP JZOJ 3316. 非回文数字
    JZOJ 3046. 游戏
    JZOJ 3013. 填充棋盘
    debian 安装oracle提供的java8
    java 汉字转拼音 PinYin4j
    debian ssh设置root权限登陆 Permission denied, please try again
    java并发下订单生成策略
  • 原文地址:https://www.cnblogs.com/sunshinekevin/p/10259707.html
Copyright © 2011-2022 走看看