zoukankan      html  css  js  c++  java
  • Java线程池—ThreadPool简介

    一、Java线程池类/接口关系图及作用

         

        

    • Executor接口:只有一个方法execute(Runnable command),用来执行用户的任务线程。
    • ExecutorService接口:继承自Executor接口,并进行扩充扩充,主要添加了shutdown()/isShutdown(),submit(Callabletast)/submit(Rannable task),invokeAll(Collection<? extends Callable> tasks),invokeAny(Collection<? extends Callable> tasks)等方法。
    • AbstractExecutorService抽象类:此抽象类实现了ExecutorService中的submit,invokeAll,invokeAny等提交任务方法,execute和shutdown等方法线程控制推迟到了其子类ThreadPoolExecutor中实现。
    • ThreadPoolExecutor类:线程池的主要实现类,实现了execute和shutdown等方法。提供了一组构造器,主构造器为
    
    ThreadPoolExecutor(
        int corePoolSize,                   // 核心线程数
        int maximumPoolSize,                // 线程池最大线程数
        long keepAliveTime,                 // 空闲线程等待任务的最长时间。
        TimeUnit unit,                      // 时间单位
        BlockingQueue workQueue,  // 任务队列
        ThreadFactory threadFactory,        // 线程创建工厂
        RejectedExecutionHandler handler)   // 线程池饱和处理策略
    
    • Executors类:线程池工厂类,通过设置不同的ThreadPoolExecutor构造器的参数,提供一系列的线程池,有newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newWorkStealingPool(通过ForkJoinPool类提供)newSingleThreadScheduledExecutor/newScheduledThreadPool(通过ScheduledThreadPoolExecutor提供,ScheduledThreadPoolExecutor继承自ThreadPoolExecutor并实现了ScheduledExecutorService接口)。

    二、线程池基础类ThreadPoolExecutor构造器参数

      

      • int corePoolSize: 线程池中的线程数量,对于newCachedThreadPool方法,corePoolSize的初始值为0,对于newFixedThreadPool(int nThreads)方法,初始值为其参数nThreads,即开始就创建nThreads个线程。
      • int maximumPoolSize:线程池中线程最大值,如在newCachedThreadPool中,值为Integer.MAX_VALUE,对于newFixedThreadPool(int nThreads),最大值nThreads。
      • long keepAliveTime:线程池中线程空闲后,线程的等待时间。如果在等待期间没有任务加入,则时间到达后线程池回收线程。
      • TimeUnit unit:等待时间单位
      • BlockingQueue workQueue:任务队列,用于存放等待执行的任务,通常有如下几种实现[2]:
        • SynchronousQueue 直接提交:newCachedThreadPool任务队列的实现,将任务直接提交而不保存,SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,因此线程池中如果不存在可用于直线任务的空闲线程,则新创建线程并运行。当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。队列本身并不存储任何元素,非常适合于传递性场景,比如在一个线程中使用的数据,传递给另外一个线程使用,SynchronousQueue的吞吐量高于LinkedBlockingQueue 和 ArrayBlockingQueue[3]。
        • LinkedBlockingQueue 无界队列:newFixedThreadPool,newSingleThreadExecutor线程池任务队列的实现。当线程池中没有可用线程时,新提交的任务将被加入到工作队列,等待有可用的空闲线程。
        • ArrayBlockingQueue 有界队列:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
      • ThreadFactory threadFactory:线程工厂,ThreadPoolExecutor提供了默认的实现DefaultThreadFactory。
      • RejectedExecutionHandler handler:处理当线程池和任务队列均满时的策略,默认使用AbortPolicy,即直接抛出异常。
        以下是JDK1.5提供的四种策略[1]:
        • AbortPolicy:直接抛出异常。
        • CallerRunsPolicy:只用调用者所在线程来运行任务。
        • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
        • DiscardPolicy:不处理,丢弃掉。
        • 当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。

               

        参考:http://leekai.me/java-threadpool/

        

  • 相关阅读:
    Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
    Servlet使用适配器模式进行增删改查案例(BaseDao.java)
    Servlet使用适配器模式进行增删改查案例(Dept.java)
    Servlet使用适配器模式进行增删改查案例(Emp.java)
    sql server案例总结
    sql server操作案例
    java语音播报案例
    Java实现网络传输数据的压缩
    Java实现网络传输数据的压缩
    LZW压缩算法原理及其Java实现
  • 原文地址:https://www.cnblogs.com/qunan/p/7717446.html
Copyright © 2011-2022 走看看