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()

  • 相关阅读:
    top 500 name
    dede 5.7 爆后台
    Mac中GDB安装
    php strcmp bypass漏洞
    文件时间伪造
    C#读取计算机插入USB历史记录
    MySQL远程连接时出现10061以及1045错误时的解决方法
    MDN 开发者分享平台
    thinkphp 3.2 完全开发手册地址
    PHP 解析JSON数组
  • 原文地址:https://www.cnblogs.com/cckong/p/14496292.html
Copyright © 2011-2022 走看看