定义: 使用极其有限的资源(线程池)去处理相对无限的任务

线程池模式UML图

ThreadPool: 负责接收和存储任务以及工作者线程的生命周期管理
    submit: 用于接收一个任务,客户端代码调用该方法向线程池提交一个任务
    shutdown: 关闭线程池对外提供的服务
Promise: 获取相应任务执行结果的凭据对象
    getResult: 获取相应任务的执行结果
    setResult: 设置相应任务的执行结果
WorkQueue: 工作队列,实现任务的缓存
    enqueue: 将任务存入队列
    dequeue: 从队列中取出一个任务
WorkerThread: 负责任务执行的工作者线程
    run: 逐一从工作队列中取出任务执行
    runTask: 执行指定的任务

像发送信息的线程,来一个请求,创建一个线程执行任务,这会造成比较大的开销,涉及到线程的创建和销毁。而Java的线程池的出现大大缓解了线程创建和销毁的开销,可以通过创建线程池ThreadPoolExecutor,让线程池去管理线程的创建和销毁,大大减小开销,也可以降低了系统的负担。下列的代码就是通过ThreadPoolExecutor创建了线程池来管理线程。做一点小小的补充,关于使用ThreadPoolExecutor创建线程池,其实还有其它方式可以创建线程池(如使用Executors去创建),不过业内阿里巴巴公司在内部开发中不允许使用Executors创建线程池,理由如下,主要还是考虑到内存溢出的问题。

package com.bruce.threadPool;import com.bruce.threadSpecificStorage.ThreadSpecificSecureRandom;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.concurrent.*;/**
* @Author: Bruce
* @Date: 2019/6/4 13:09
* @Version 1.0
*/
public class SmsVerficationCodeSender {private Logger LOG = LoggerFactory.getLogger(SmsVerficationCodeSender.class);public static void config() {PropertyConfigurator.configure("C:/Users/Bruce/Downloads/LearningJavaProject/practice/designpatternconcurrent/src/main/resource/log4j.properties");}private static final ExecutorService EXECUTOR =new ThreadPoolExecutor(1, Runtime.getRuntime().availableProcessors(), 60, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), new ThreadFactory() {@Overridepublic Thread newThread(Runnable r) {Thread t = new Thread(r, "VerfCodeSender");t.setDaemon(true);return t;}}, new ThreadPoolExecutor.DiscardPolicy());public static void main(String[] args) {config();SmsVerficationCodeSender client = new SmsVerficationCodeSender();client.sendVerificationSms("1223049442");client.sendVerificationSms("1234442343");client.sendVerificationSms("1988323232");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}public void sendVerificationSms(final String msisdn) {Runnable task = new Runnable() {@Overridepublic void run() {int verificationCode = ThreadSpecificSecureRandom.INSTANCE.nextInt(99999);DecimalFormat df = new DecimalFormat("00000");String txtVerCode = df.format(verificationCode);sendSms(msisdn, txtVerCode);}};EXECUTOR.submit(task);}private void sendSms(String msisdn, String verificationCode) {LOG.info("Sending verification code " + verificationCode + " to " + msisdn);}
}

线程池模式的优点:
1. 抵消线程创建的开销,提高响应性
2. 封装了工作者线程生命周期管理
3. 减少销魂线程的开销

推荐阅读

深入理解Java并发编程(六):使用线程池的正确姿势

参考资料

黄文海 Java多线程编程实战指南(设计模式篇)

黄文海的Github

多线程设计模式-线程池模式相关推荐

  1. 线程池模式比较-------ICE线程池模型------L/F领导者跟随者模式

    程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解析 ...

  2. 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目

    阿里的面试官问了个问题,如果corepollSize=10,MaxPollSize=20,如果来了25个线程 怎么办, 答案: 当一个任务通过execute(Runnable)方法欲添加到线程池时: ...

  3. C++多线程以及线程池

    1 线程 1.1 简介   线程(英语:thread)是操作系统能够进行运算调度的最小单位.大部分情况下,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程 ...

  4. 后端开发【一大波有用知识】Redis中的IO多线程(线程池)

    一.Redis中的IO多线程原理 ​服务端收到一条信息,给它deconde成一条命令 然后根据命令获得一个结果(reply) 然后将结果encode后,发送回去 redis的单线程是指,命令执行(lo ...

  5. Java的多线程和线程池的使用,你真的清楚了吗?

    Java的多线程和线程池的使用 多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务.开启一个线程有4种方式,在下面的文章我将详细的去讲解. 继承Thread 继承Thr ...

  6. Java多线程之线程池配置合理线程数

    Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...

  7. Java多线程之线程池的手写改造和拒绝策略

    Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...

  8. Java多线程之线程池7大参数、底层工作原理、拒绝策略详解

    Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...

  9. Java多线程之线程池详解

    Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...

最新文章

  1. .NET Micro Framework动态调用C/C++底层代码(原理篇)
  2. 自学python好找工作吗-自学Python如何找工作?多久能找到工作?
  3. keepalived(9)——sorry_server
  4. spring-boot 一款无侵入型,轻量级的接口文档生成工具apiggs
  5. 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法
  6. docker安装mysql主从视频教程_docker安装mysql主从
  7. 谁说Python慢来着?不用Python,这个问题难倒了无数的程序员
  8. 天猫京东618下单金额近万亿;苹果或选择印度组装新款iPhone SE;Adobe将于12月31日终止支持Flash| 极客头条...
  9. 使用DTW算法对上证50成分股走势进行聚类分析
  10. ios 博客及论坛整理
  11. ChemDraw加键的两种方法
  12. win10 ISO镜像下载
  13. [ABC283D] 题解
  14. DAE系统的设计-豆瓣首席架构师洪强宁
  15. 设置liunx服务器编码,中文乱码问题
  16. 夜来风雨声,对象知多少。
  17. 最全Python算法入门
  18. 微信小程序人工智能之添加学生信息
  19. 使用QianWei网站源码配合cpolar,发布本地音乐分享网站
  20. AVFoundation使用AirPlay

热门文章

  1. 【论文阅读】一种包含同态加密、差分隐私、多方安全计算的FL隐私保护框架 Efficient and Privacy-Enhanced Federated Learning for Industrial
  2. JS之向上取整、向下取整、四舍五入等
  3. 自学软件测试1个半月上岸拿5个offer
  4. 在Python中如何判断一个对象的类型?
  5. 笔记本双无线网卡内外网配置路由
  6. C++primer学习:关于upper_bound和lower_bound的探究.
  7. 开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)
  8. PPT写得好的人,为什么都如此遭人痛恨?
  9. ARM工控主板比X86工控主板好吗?
  10. MTU and MSS