zoukankan      html  css  js  c++  java
  • 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方法

  • 相关阅读:
    shell截取字符串的方法
    安装sql server managerment studio报错"The instance id is required but it is missing"
    windows 80端口被占用的解决方法
    centos如何安装软件
    ORA-00257归档日志写满的解决方法
    VCenter克隆虚拟机报错msg.snapshot.error-QUIESCINGERROR
    如何启动或关闭oracle的归档(ARCHIVELOG)模式
    ubuntu下nagios配置
    vsphere vcenter server下安装ubuntu的vmwaretools
    virtualbox迁移至vcenter/vmware workstation
  • 原文地址:https://www.cnblogs.com/pomer-huang/p/Java-Executor.html
Copyright © 2011-2022 走看看