zoukankan      html  css  js  c++  java
  • 【JUC】线程池原理及七大参数

    1.线程池原理

    (1)银行办理窗口。柜台有五个(最大线程数),但是在不忙的情况下只有3个开启着(核心线程数)。

    现在来了三个人 办理业务 。那么三个窗口开始办理。

     (2)前面柜台三个人还没办理完业务,再来的人进去椅子坐着(等待队列)。

     (3)大厅满了,又来一个客人,这时启动其他工作线程 4号窗口

     (4)所以工作窗口都开启了 而且大厅坐满了,这时候又来客人了,应用我们的银行条例处理(拒绝策略)

    2.执行流程

    (1)进来的先去核心线程工作

    (2)不够的去阻塞队列,核心线程以FIFO拿任务。

    (3)阻塞队列满,启动其他工作线程。

    (4)都满了 就应用拒绝策略。

    详细版

    1)创建一个线程池,在还没有任务提交的时候,默认线程池里面是没有线程的。也可以调用prestartCoreThread方法,来预先创建一个核心线程。
    2)线程池里还没有线程或者线程池里存活的线程数小于核心线程数corePoolSize时,这时对于一个新提交的任务,线程池会创建一个线程去处理提交的任务。此时线程池里面的线程会一直存活着,就算空闲时间超过了keepAliveTime,线程也不会被销毁,而是一直阻塞在那里一直等待任务队列的任务来执行。
    3)当线程池里面存活的线程数已经等于corePoolSize了,对于一个新提交的任务,会被放进任务队列workQueue排队等待执行。而之前创建的线程并不会被销毁,而是不断的去拿阻塞队列里面的任务,当任务队列为空时,线程会阻塞,直到有任务被放进任务队列,线程拿到任务后继续执行,执行完了过后会继续去拿任务。这也是为什么线程池队列要是用阻塞队列。
    4)当线程池里面存活的线程数已经等于corePoolSize了,并且任务队列也满了,这里假设maximumPoolSize>corePoolSize(如果等于的话,就直接拒绝了),这时如果再来新的任务,线程池就会继续创建新的线程来处理新的任务,知道线程数达到maximumPoolSize,就不会再创建了。这些新创建的线程执行完了当前任务过后,在任务队列里面还有任务的时候也不会销毁,而是去任务队列拿任务出来执行。在当前线程数大于corePoolSize过后,线程执行完当前任务,会有一个判断当前线程是否需要销毁的逻辑:如果能从任务队列中拿到任务,那么继续执行,如果拿任务时阻塞(说明队列中没有任务),那超过keepAliveTime时间就直接返回null并且销毁当前线程,直到线程池里面的线程数等于corePoolSize之后才不会进行线程销毁。
    5)如果当前的线程数达到了maximumPoolSize,并且任务队列也满了,这种情况下还有新的任务过来,那就直接采用拒绝的处理器进行处理。默认的处理器逻辑是抛出一个RejectedExecutionException异常

    刚开始 没有任务提交的时候是没有线程的,核心线程也没有。要一个个任务的提交,然后从0开始创建核心线程。

    3.

    4.七大参数

     5.建议用上面ThreadPoolExecutor方式创建线程池 原因是在阿里巴巴Java手册写了

    6.四大拒绝策略

    ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

    ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。

    ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务

    ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

    默认为第一个 AbortPolicy()

  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/cckong/p/14496292.html
Copyright © 2011-2022 走看看