一、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/

  

Java线程池—ThreadPool简介的更多相关文章

  1. java线程池ThreadPool

    package com.java.concurrent; import java.util.concurrent.ExecutorService; import java.util.concurren ...

  2. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间.    如果:T1 + T3 远大于 T2,则可以 ...

  3. Java提高班(二)深入理解线程池ThreadPool

    本文你将获得以下信息: 线程池源码解读 线程池执行流程分析 带返回值的线程池实现 延迟线程池实现 为了方便读者理解,本文会由浅入深,先从线程池的使用开始再延伸到源码解读和源码分析等高级内容,读者可根据 ...

  4. java线程池的原理及实现

    1.线程池简介:     多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.         假设一个服务器完成一项任务所需时间为:T1 ...

  5. Java 线程池比较

    小结: 1. 高级面试题总结—线程池还能这么玩? - 这个时代,作为程序员可能要学习小程序 - CSDN博客https://blog.csdn.net/androidstarjack/article/ ...

  6. Java 线程池的原理及实现

    1.线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线 ...

  7. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  8. Java线程池的几种实现 及 常见问题讲解

    工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...

  9. Java线程池应用

    Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...

随机推荐

  1. LapSRN

    Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution 解决问题: 1.bicubic预处理上下采样,计算复杂度高 ...

  2. Spring boot 配置https 实现java通过https接口访问

    近来公司需要搭建一个https的服务器来调试接口(服务器用的spring boot框架),刚开始接触就是一顿百度,最后发现互联网认可的https安全链接的证书需要去CA认证机构申请,由于是调试阶段就采 ...

  3. appium+python3+pycharm踩得坑2

    没相当刚把上一个错误解决,这个马上就解决了: selenium.common.exceptions.WebDriverException: Message: A new session could n ...

  4. Haproxy官方文档翻译(第二章)配置Haproxy 附英文原文

    2.配置 HAProxy 2.1 配置文件格式 Haproxy的配置过程包含了3部分的参数资源:- 命令行中的参数,此种参数总是享有优先权被使用- 配置文件中global节点中的参数,此种参数是进程范 ...

  5. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  6. redis哨兵集群配置

    redis 集群架构图: 需要先配置redis主从,我这边是单机部署的. 采用一主一从,两个sentinel. redis host: 172.31.11.235 redis-master port: ...

  7. @Override报错的处理

    有时候我们从SVN导的项目,jre和jar包都没问题,但是就会出如下图的错误: xi 点击红叉,显示错误信息如下: 点击工具里面的window-->preferences-->java-- ...

  8. jsp中的绝对路径、相对路径和访问jsp的方式

    1.jsp的绝对路径 绝对路径在复制jsp时不用修改路径都会正常显示,但是绝对路径${pageContext.request.contextPath}只有jsp可以识别 例如:相对路径:image/l ...

  9. Redis 错误:Failed with result 'start-limit-hit'

    Redis 错误:Failed with result 'start-limit-hit' 背景 Redis 版本为 5.0.4: 文件 /etc/systemd/system/redis.servi ...

  10. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...