为什么80%的码农都做不了架构师?>>>   

1 public ThreadPoolExecutor(int corePoolSize,
2                                       int maximumPoolSize,
3                                       long keepAliveTime,
4                                       TimeUnit unit,
5                                       BlockingQueue<Runnable> workQueue,
6                                       ThreadFactory threadFactory,
7                                       RejectedExecutionHandler handler)

1. 参数解释
corePoolSize:        线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:      线程池维护线程所允许的空闲时间
unit:                   线程池维护线程所允许的空闲时间的单位
workQueue:          线程池所使用的缓冲队列
handler:               线程池对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()

unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
ThreadPoolExecutor.AbortPolicy()            抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy()       重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy()    抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy()          抛弃当前的任务

2. 方法调用
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。

3. 处理机制
当一个任务通过execute(Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。

处理任务的多时:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
处理任务的少时:
当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

4. 创建线程池的一些方法:

01 public static ExecutorService newFixedThreadPool(int nThreads) {
02     return new ThreadPoolExecutor(nThreads,
03                                 nThreads,
04                                 0L,
05                                 TimeUnit.MILLISECONDS,
06                                 newLinkedBlockingQueue<Runnable>());    
07 }
08  
09 public static ExecutorService newCachedThreadPool() {
10     return new ThreadPoolExecutor(0,
11                                 Integer.MAX_VALUE,
12                                 60L,
13                                 TimeUnit.SECONDS,
14                                 newSynchronousQueue<Runnable>());    
15 }
16  
17 public static ExecutorService newSingleThreadExecutor() {
18     return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,
19                                                                         1,
20                                                                         0L,
21                                                                         TimeUnit.MILLISECONDS,
22                                                                         newLinkedBlockingQueue<Runnable>()));

转载于:https://my.oschina.net/004/blog/211994

Java多线程:类ThreadPoolExecutor详解相关推荐

  1. JAVA 多线程并发超详解

    JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...

  2. Java——多线程之方法详解

    Java多线程系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多 ...

  3. Java多线程(超详解)

    目录 1. 线程简介 1.1 程序 1.2 进程 1.3 线程 1.4 多线程 1.5 普通方法调用和多线程 2. 线程创建 2.1 继承Thread类 2.2 实现Runnable接口 2.3 实现 ...

  4. java 多线程同步_详解Java多线程编程中的线程同步方法

    1.多线程的同步: 1.1.同步机制:在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直 ...

  5. Java常用类StringBuffer详解

    内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...

  6. java 多线程基础 万字详解(通俗易懂)

    目录 一.前言 二.定义 1.进程 : 2.线程 : 3.单线程与多线程 : 4.并发与并行 : 三.线程的创建 1.创建线程的两种基本方式 : 1° 继承Thread类,并重写run方法 1.5° ...

  7. (五)Java工具类ArrayUtils详解

    说明:ArrayUtils工具类在标准的应用程序中是不可以被实例化的:  参考:[参考地址](http://commons.apache.org/proper/commons-lang/javadoc ...

  8. java bufferedreader类_详解java中的BufferedReader类

    Java中BufferedReader类 构造方法: 一:public BufferedReader(Reader in,int sz) 1.用指定大小输入缓冲区的缓冲字符输入流: 2.in 一个 R ...

  9. java多线程:ThreadLocal详解

    场景: 登录用户的信息保存与获取问题. 在常规的系统设计中,后端系统通常会有一个很长的调用链路(Controller->Service->Dao). 通常用户在登陆之后,用户信息会保存在s ...

最新文章

  1. Python模块与类
  2. Leetcode: Populating Next Right Pointers in Each Node II
  3. 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】
  4. Apache、tomcat、Nginx常用配置合集
  5. C语言中的“三字母词”坑了工程师
  6. php模块安装 pdo_mysql_关于php插件pdo_mysql的安装
  7. Oracle集合查询
  8. linux内核 默认路由表,[Linux] linux路由表-Go语言中文社区
  9. 这是300年后的人类生活!你相信吗?
  10. 使用 Sublime 比较文档差异
  11. MWC-电机、电池螺旋桨搭配
  12. linux下的系统垃圾清理
  13. Spring漫画学习笔记(一) 什么是BeanDefinition
  14. 基于人脸识别的考勤系统:Python3 + Qt5 + OpenCV3 + FaceNet + MySQL
  15. ABM410-ASEMI贴片整流桥ABM410
  16. C++ Reference: Standard C++ Library reference: C Library: cstdio: FILE
  17. java验证码验证码_Java登录页面实时验证用户名密码和动态验证码
  18. [2017校招]大可打卡1
  19. 小波分析:db小波的分解与重构
  20. VS2017中文乱码

热门文章

  1. 电动汽车:新一轮三年十倍,“补贴”结束“高端”开启
  2. 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
  3. 世界首富贝佐斯将“退休”
  4. 买房必看!又一程序员自编“购房宝典”火爆 GitHub
  5. 童心制物(Makeblock)受邀参加2020年韩国机器人世界展览会,倡导以先进的STEAM教育培养未来复合型人才
  6. 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
  7. 关于redis的几件小事(三)redis的数据类型与使用场景
  8. 基于htmlparser实现网页内容解析
  9. Sqlserver 查询 临时字段
  10. c++版a+b问题的各种无聊做法