2019独角兽企业重金招聘Python工程师标准>>>

创建

通过ThreadPoolExecutor来创建一个线程池

new ThreadPoolExecutor(corePoolSize, maximumPoolSize,
keepAliveTime, milliseconds,runnableTaskQueue, threadFactory,handler);

参数说明:

  • corePoolSize 线程池中任务的基本个数

    • 新提交一个任务时,若线程池中个数未达到基本个数,则新建一个线程
    • 到线程池中的线程数达到基本个数时,再提交任务,则看是否有空闲线程,有则只直接使用
    • 若无空闲线程,则新几条的任务放入排队
  • maximumPoolSize 线程chi池中任务的做多个数
    • 当线程池中个数达到 corePoolSize & 且队列排满了
    • 新创建线程来执行任务
    • 当线程池中任务达到maximumPoolSize,则不再创建
  • keepAliveTime 线程池的工作线程空闲后存活的时间
  • milliseconds 配合上个参数使用,表示时间的单位,如TimeUnit.SECONDS
  • runnableTaskQueue 排队队列
    • ArrayBlockingQueue基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序
    • LinkedBlockingQueue 基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue
    • SynchronousQueue 一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue
    • PriorityBlockingQueue 一个具有优先级得无限阻塞队列
  • threadFactory 创建线程的工厂,通常会重新指定线程名,方便debug
  • handler 线程池饱和策略
    • 当线程数达到 maximumPoolsize 队列已满时,表示饱和
    • CallerRunsPolicy 只用调用者所在线程来运行任务
    • DiscardOldestPolicy 丢弃队列里最近的一个任务,并执行当前任务
    • DiscardPolicy 不处理,丢弃掉
    • AbortPolicy 抛异常
    • 也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略

线程池提交任务的处理流程

提交任务

1. execute(Runnable)

直接执行一个实现了Runnable的接口,即表示提交了一个异步任务给线程池

2. submit(Runnable)

相比较于上面的,区别是这个会返回一个 Future<V> 对象,通过调用future.get() 可以获取线程的返回值,其中这个方程是线程阻塞的,直到返回了结果之后,才会继续执行下去

关闭线程

线程池的shutdown或shutdownNow方法来关闭线程池

shutdown的原理是只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程

shutdownNow的原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的任务可能永远无法终止

调用了这两个关闭方法的其中一个,isShutdown方法就会返回true。当所有的任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法会返回true。

至于我们应该调用哪一种方法来关闭线程池,应该由提交到线程池的任务特性决定,通常调用shutdown来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow

线程池的配置

分析

  1. 任务的性质:CPU密集型任务,IO密集型任务和混合型任务。

    • CPU密集型任务配置尽可能少的线程数量,如配置Ncpu+1个线程的线程池
    • IO密集型任务则由于需要等待IO操作,线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu
    • 混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解
  2. 任务的优先级:高,中和低。
    • 优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理
  3. 任务的执行时间:长,中和短。
    • 执行时间不同的任务可以交给不同规模的线程池来处理,或者也可以使用优先级队列,让执行时间短的任务先执行
  4. 任务的依赖性:是否依赖其他系统资源,如数据库连接。
    • 因为线程提交SQL后需要等待数据库返回结果,如果等待的时间越长CPU空闲时间就越长,那么线程数应该设置越大,这样才能更好的利用CPU

获取线程数

Runtime.getRuntime().availableProcessors()

实例分析

背景:

实现一个异步的报警case,首先是有三种报警方式,邮件、微信、短信;其次是具体的报警都是异步处理(一个报警执行的线程池);要求一分钟内报警有上限设置(即要实现报警的计数与清零);报警的重要性根据邮件-》微信-》短信进行递增,当超过每个报警类型的最低阀值时,晋升报警类型

silver-alarm 一个报警的基本框架

源码传送门

转载于:https://my.oschina.net/u/566591/blog/889435

Java 并发之线程池学习相关推荐

  1. Java并发之线程池ThreadPoolExecutor源码分析学习

    线程池学习 以下所有内容以及源码分析都是基于JDK1.8的,请知悉. ​ 我写博客就真的比较没有顺序了,这可能跟我的学习方式有关,我自己也觉得这样挺不好的,但是没办法说服自己去改变,所以也只能这样想到 ...

  2. java并发之线程池

    文章目录 @[TOC] 1:ThreadPoolExcutor (1):ThreadPoolExcutor构造函数 (2):构造函数的参数 (3):图示 核心线程数 最大线程数 阻塞队列 (4):一个 ...

  3. Java常用四大线程池用法以及ThreadPoolExecutor详解

    2019独角兽企业重金招聘Python工程师标准>>> 为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多 ...

  4. 四十七、面试前,必须搞懂Java中的线程池ThreadPoolExecutor(上篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 自定义线程池-java内置线程池构造方法介绍

    Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...

  6. java workerdone_【架构】Java并发编程——线程池的使用

    前言 如果我们要使用线程的时候就去创建一个,这样虽然非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为 ...

  7. Java—这把线程池ThreadPoolExecutor操作,你学会了吗?

    关注微信公众号:CodingTechWork,一起学习进步. 引导 要求:线程资源必须通过线程池提供,不允许在应用自行显式创建线程: 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资 ...

  8. Java内置线程池ExecutorService介绍及商品秒杀案例

    第一.ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用 常用方法: void shutdown() 启动一次顺序关闭,执行 ...

  9. Java 并发编程 -- 线程池源码实战

    一.概述 小编在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写的太简单,只写了一点皮毛,要么就是是晦涩难懂,看完之后几乎都 ...

最新文章

  1. Matlab矩阵的产生
  2. 黑白棋子的移动(东方化改题+???)
  3. 【数据结构与算法】之深入解析“UTF-8编码验证”的求解思路与算法示例
  4. mysql下拉框记忆,Mysql alter语句记忆分析
  5. sql 2012先分离迁移mdf mlf 文件到别的机器后附加 数据库成只读的修复方法
  6. HttpClinet学习笔记
  7. 【转】概要设计说明书
  8. 16.Python略有小成(内置模块Ⅱ)
  9. ajax实现翻书效果,jQuery实现手机版页面翻页效果的简单实例
  10. 微信小程序笔记六模块化 —— module.exports
  11. mysql5.7的存储过程_MySql5.7命令笔记(三)mysql存储过程命令
  12. 苹果 M1带起ARM,英特尔 x86 霸主地位遭威胁
  13. Dos命令批量操作复制出26个虚拟盘空间
  14. 设计模式之三:装饰者模式(简单实现(星巴兹咖啡))
  15. 函数最值题目及答案_高考数学攻克压轴题:圆锥曲线取值范围和最值问题解题模型...
  16. Configuration Manager 2012 R2系统需求
  17. AD09导出光绘文件(Gerber)
  18. 计算机二级显示用户不存在,计算机二级考试最常见的错误集合
  19. 搭建iscsi存储系统(一)
  20. Office EXCEL如何批量把以文本形式存储的数字转换为数字

热门文章

  1. jsf表单验证_JSF验证示例教程–验证器标签,定制验证器
  2. cloudfoundry servicce-broker部署错误分析
  3. 一文读懂C++程序的结构、执行与编译
  4. C语言基础学习教程之数据类型
  5. 什么是接口?如何定义接口?如何实现接口?
  6. iptables 防火墙为什么不占用端口?
  7. Ubuntu终端里面显示路径名称太长,怎么设置变短【转】
  8. JAVA实现随机无重复数字功能
  9. VisualSVN Server 服务器资源目录
  10. javascript-从toString方法在判断复杂数据类型上的妙用,引申到对原型链的理解...