• Java线程池 Executor框架概述


    线程池的意义

    1. 循环利用线程资源,避免重复创建和销毁线程
    2. 线程池的任务是异步执行的,只要提交完成就能快速返回,可以提高应用响应性
    3. Java线程池还有一个很重要的意义:Java线程池就是JDK 5 推出的Executor框架,在此之前Java线程既是工作任务又是执行机制,而Executor框架把工作任务与执行机制分离开来:工作任务包括Runnable接口和Callable接口,而执行机制由Executor接口提供。

    Executor 类继承体系

    Executor框架由三个部分组成

    1. 工作任务:Runnable/Callable 接口
      • 工作任务就是Runnable/Callable接口的实现,可以被线程池执行
    2. 执行机制:Executor接口、ExecutorService接口、ScheduledExecutorService接口
      • ThreadPoolExecutor 是最核心的线程池实现,用来执行被提交的任务
      • ScheduledThreadPoolExecutor 是任务调度的线程池实现,可以在给定的延迟后运行命令,或者定期执行命令(它比Timer更灵活)
      • ForkJoinPool是一个并发执行框架
    3. 异步计算的结果:Future接口
      • 实现Future接口的FutureTask类,代表异步计算的结果

    线程池的实现原理

    线程池的5个重要参数(需记牢):

    • workQueue:工作(任务)队列
    • corePoolSize、maximumPoolSize:最小最大线程数
    • keepAliveTime:线程存活时间
    • threadFactory:线程工厂
    • handler:拒绝策略

    1. 如果运行的线程数少于corePoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)
    2. 否则,说明线程数大于corePoolSize,将任务插入BlockingQueue
    3. 如果插入任务失败(队列已满),且运行的线程数少于maximumPoolSize,创建新线程来处理任务(注意,这一步需要获取全局锁)
    4. 否则,说明线程数大于maximumPoolSize,执行拒绝策略

    ThreadPoolExecutor 采取上述设计思路,是为了尽可能地避免获取全局锁,在完成预热之后(当前运行的线程数大于等于corePoolSize),则几乎所有的调用都是执行步骤2,而步骤2不需要获取全局锁

    关闭线程池

    可以调用shutdown()或shutdownNow()来关闭线程池,其中原理是遍历所有工作线程,然后逐个调用线程的interrupt()来进行中断。但是它们存在一定的区别,shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

    只要调用了这两个关闭方法中的任意一个,isShutdown()就会返回true。当所有的任务都关闭后,才表示线程池关闭成功,这时调用isTerminaed()会返回true。至于调用哪一种方法来关闭线程池,应该由线程池的任务特性决定,通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法

  • 相关阅读:
    Python
    按行读取文本,去重行
    Python字符串---固定长度分割字符串
    python终端打印带颜色的print
    Django安装与删除
    Python拼接字符串的7种方法
    CSS指定标签样式style选择器
    python 使用函数名的字符串调用函数(4种方法)
    test
    字符串常用操作
  • 原文地址:https://www.cnblogs.com/pomer-huang/p/Java-Executor.html
Copyright © 2020-2023  润新知