多线程设计模式-线程池模式
定义: 使用极其有限的资源(线程池)去处理相对无限的任务
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
多线程设计模式-线程池模式相关推荐
- 线程池模式比较-------ICE线程池模型------L/F领导者跟随者模式
程池模式一般分为两种:L/F领导者与跟随者模式.HS/HA半同步/半异步模式. HS/HA 半同步/ 半异步模式 :分为三层,同步层.队列层.异步层,又称为生产者消费者模式,主线程处理I/O事件并解析 ...
- 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
阿里的面试官问了个问题,如果corepollSize=10,MaxPollSize=20,如果来了25个线程 怎么办, 答案: 当一个任务通过execute(Runnable)方法欲添加到线程池时: ...
- C++多线程以及线程池
1 线程 1.1 简介 线程(英语:thread)是操作系统能够进行运算调度的最小单位.大部分情况下,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程 ...
- 后端开发【一大波有用知识】Redis中的IO多线程(线程池)
一.Redis中的IO多线程原理 服务端收到一条信息,给它deconde成一条命令 然后根据命令获得一个结果(reply) 然后将结果encode后,发送回去 redis的单线程是指,命令执行(lo ...
- Java的多线程和线程池的使用,你真的清楚了吗?
Java的多线程和线程池的使用 多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务.开启一个线程有4种方式,在下面的文章我将详细的去讲解. 继承Thread 继承Thr ...
- Java多线程之线程池配置合理线程数
Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
最新文章
- .NET Micro Framework动态调用C/C++底层代码(原理篇)
- 自学python好找工作吗-自学Python如何找工作?多久能找到工作?
- keepalived(9)——sorry_server
- spring-boot 一款无侵入型,轻量级的接口文档生成工具apiggs
- 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法
- docker安装mysql主从视频教程_docker安装mysql主从
- 谁说Python慢来着?不用Python,这个问题难倒了无数的程序员
- 天猫京东618下单金额近万亿;苹果或选择印度组装新款iPhone SE;Adobe将于12月31日终止支持Flash| 极客头条...
- 使用DTW算法对上证50成分股走势进行聚类分析
- ios 博客及论坛整理
- ChemDraw加键的两种方法
- win10 ISO镜像下载
- [ABC283D] 题解
- DAE系统的设计-豆瓣首席架构师洪强宁
- 设置liunx服务器编码,中文乱码问题
- 夜来风雨声,对象知多少。
- 最全Python算法入门
- 微信小程序人工智能之添加学生信息
- 使用QianWei网站源码配合cpolar,发布本地音乐分享网站
- AVFoundation使用AirPlay
热门文章
- 【论文阅读】一种包含同态加密、差分隐私、多方安全计算的FL隐私保护框架 Efficient and Privacy-Enhanced Federated Learning for Industrial
- JS之向上取整、向下取整、四舍五入等
- 自学软件测试1个半月上岸拿5个offer
- 在Python中如何判断一个对象的类型?
- 笔记本双无线网卡内外网配置路由
- C++primer学习:关于upper_bound和lower_bound的探究.
- 开源鸿蒙南向嵌入学习笔记——NAPI框架学习(一)
- PPT写得好的人,为什么都如此遭人痛恨?
- ARM工控主板比X86工控主板好吗?
- MTU and MSS