最新要闻
- 中国西北地区发现广泛分布的侏罗纪被子植物化石
- 3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
- 环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
- 世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
- 当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
- 天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
- 【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
- 真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
- 当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
- 当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
- 世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
- 世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
- 今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
- 环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
- 最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
- 今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ThreadPool实现机制
Android中阻塞队列的应用有哪些
阻塞队列在 Android 中有很多应用,比如:
(资料图片)
- 线程池:线程池任务的执行就是基于一个阻塞队列,如果线程池任务已满,则任务需要等待阻塞队列中的其他任务完成。
- Handler 消息队列:Handler 的消息队列也是一种阻塞队列。handler发送消息时,首先将消息加入到消息队列中,在空闲状态下 MessageQueue 队列是阻塞的状态,直到队列不为空,Looper 开始轮询 MessageQueue 里面的 Message。
阻塞队列支持两个核心方法,分别为:
- put(E e):将元素插入队尾,支持阻塞式插入,在容量无限制的情况下一直等待直到队列有空闲位置。
- take(): 获取且移除此队列的头部,在队列为空时,阻塞等待这个头部可用,并返回被取出的元素。
在 Java 中,阻塞队列的实现类有 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue 等等。这些队列通过使用 Lock 和 Condition 来保证队列的线程安全。
阻塞队列的原理
是当阻塞队列中没有数据的时候,读线程将被阻塞;当阻塞队列已满的时候,写线程将被阻塞。阻塞队列通过内部锁来控制读和写操作的相互访问以及有序性,保证在多线程并发的时候,执行插入或读取操作是广泛可接受的,而不会引起任何问题。
线程池是维护一个工作线程的线程容器,用于优化线程的创建和销毁带来的开销。下面简单介绍一下线程池的底层实现原理。
线程池执行流程
- 在初始化时,线程池会通过
ThreadPoolExecutor
构造函数赋值并创建核心线程池; execute()
方法将任务存放到阻塞队列中,如果有空闲线程,则取出最先进入队列的任务开始执行,否则加入等待中的队列中;- 当队列长度达到阈值时,不再继续增加,此时若仍有新任务提交,则以上空闲线程处理任务;若添加的线程数仍超过最大线程数时,则拒绝该任务。
参数说明:
以下是线程池最基本的四类参数。
核心线程数(corePoolSize):线程池中的基本线程数。当任务提交后,分类讨论:
- 若线程池中的线程数小于 corePoolSize,那么即使线程池中还有空余的线程,也会直接添加一个新线程去处理当前的任务;
- 若线程池已经有了 corePoolSize 个线程,那么任务就被加入阻塞队列进行缓冲,等待有空闲的线程来处理;
- 一次性只能创建 corePoolSize 个线程。
最大线程数(maximumPoolSize):线程池中允许存在的最大线程数。当缓冲队列满时,对于大于 corePoolSize 的任务将会此项启动更多的 Thread 来处理用户请求,针对有界和无界不同表现。如有等待队列功能满了后会执行
RejectedExecutionException
。在我看来这个配置很鸡肋,往往在它小于corepoolsize
时候有表现,大于情况视大于多少对线程池复用机制上友好而已。有不对的欢迎评论区讨论下;队列容量(workQueue):等待任务的队列容量。在调用 execute() 方法时,阻塞队列可以用以下三种类型之一:
- FIFO(先进先出)队列,使用java.util.concurrent.LinkedBlockingQueue,默认无界限大小。因此 newFixedThreadPool() 和 newSingleThreadExecutor() 的线程数最多也可能会达到 Integer.MAX_VALUE,会导致OOM等问题。但你可指定其大小。
- LIFO(后进先出)队列,使用java.util.concurrent.LinkedBlockingDeque,特点是新任务插到队尾上,但在 JDK7 中不再使用这个队列,因为它是不符合 Java 应用程序的行为模式的;
- 优先级队列,使用java.util.concurrent.PriorityBlockingQueue 类实现,按照元素等级来排序,低等级对象会先被获取,对于高等级的任务可以提前执行。
空闲线程销毁时间(keepAliveTime):线程池中没有任务执行时,即空闲状态下的线程没事可做,这些空闲的线程会自动的销毁,首先由coreThreadHandle(正常获得锁的线程)完成剩下工作,然后 wait coreHandle 释放锁资源,休眠到内部队列不为空或超时返回,如果休眠超时则表示该线程超时了,在低于 corePoolSize 的情况下 除非设置allowCoreThreadTimout=true,否则永远不会发生;
实例代码
public class TestThreadPoll implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在执行..."); }} public static void main(String[] args) { // 创建一个基本的线程池 ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { Runnable task = new TestThreadPoll(); executor.execute(task); } executor.shutdown(); }
上面的创建了一个基本的线程池,并进行了线程数的添加。
线程池排队机制
当线程池中所有的线程都在执行任务时,如果新提交的任务需要被执行,那么这个新的任务会进入到一个阻塞队列中排队等待。而ThreadPoolExecutor中有四种常见的阻塞队列:SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue。
其中SynchronousQueue是没有任何储存功能的阻塞队列,它只负责一个任务的传递,即前一个任务将后一个任务提交给线程池后直接结束,而不是进入等待队列。由于该队列没有储存空间,所以当一个线程提交任务时,该队列会寻找与之对应的另一个线程来接收这个任务。如果此时线程池处于饱和状态,这个任务就有可能被丢弃。
LinkedBlockingQueue则是一个带储存功能的无界队列,也就是说,这个队列可以一直往里添加新的元素。因此,它的长度限制仅仅是由内存大小来控制,如果你的阻塞队列需要存储非常多的任务,那么最好选用这个类型的阻塞队列。
ArrayBlockingQueue也是一个带储存功能的有界队列,它的长度是预设好的,如果你试图往这个队列中添加超过预设长度的任务,那么新增的任务就必须要等待其他任务完成或者被移除后才能加入队列了,换而言之,在这种队列中,无法满足新任务的请求时会出现阻塞情况。
PriorityBlockingQueue则是一个支持优先级排序的无界队列,也就是说,任务可以通过实现Comparable接口来设置一个队列中的优先级关系。当使用优先级队列时,可以为不同的任务设置不同的优先级,程序会按照任务的优先级顺序执行具体的任务。
自实现一个线程池实例
以下是一个简单的自实现线程池示例:
public class MyThreadPool { private final BlockingQueue workQueue; private final WorkerThread[] workers; public MyThreadPool(int nThreads) { this.workQueue = new LinkedBlockingQueue<>(); this.workers = new WorkerThread[nThreads]; for (int i = 0; i < nThreads; i++) { workers[i] = new WorkerThread(); workers[i].start(); } } public void execute(Runnable task) { synchronized (workQueue) { workQueue.add(task); workQueue.notify(); } } private class WorkerThread extends Thread { @Override public void run() { while(true) { Runnable task; synchronized (workQueue) { while (workQueue.isEmpty()) { try { workQueue.wait(); } catch (InterruptedException e) { return; } } task = workQueue.poll(); } try { task.run(); } catch(Throwable t) { // error handling code } } } }}
这是一个最简单的线程池实现,其核心思想就是:在.WorkerThread类中定义了一个死循环,负责从任务队列中取出任务并执行。如果目前没有任务,则等待新任务到来。
使用时初始化线程池:
MyThreadPool pool = new MyThreadPool(2);
之后将需要做的任务加入线程池中:
pool.execute(new Runnable() { @Override public void run() { // 执行具体的任务代码 }});
至此,自实现的线程池实例就完成了。
execute框架解读
execute()
是Java中Executor接口的一个方法,它在执行传递给它的Runnable任务时使用。Executor框架提供了一种将任务提交给线程池以异步执行的方式。当我们想要某段代码在异步环境中运行,又不需要知道每个任务何时完成时(所需时间可能会非常不同)的情况下,就可以使用这个框架。该框架管理和复用线程,以避免耗费创建他们的代价,并且在执行完任务后返回线程到线程池。execute()
方法的目的是在默认池中安排一个任务来执行,由于这个方法只是将任务提交给线程池并立即返回,因此不能保证任务已经执行。这个方法只有在向线程池中添加任务时需要使用,例如对于没有返回值的简单操作或前置条件检查。以下是execute()
的方法语法:
void execute(Runnable command);
参数:
command
:Runnable对象,该接口定义了需要在线程上执行的任务。
实现:该方法直接将任务提交给主执行器以异步执行。然后返回而不等待任务的结束。如果需要使用结果,则调用submit
方法。
//newFixedThreadPool 被重载用来覆盖默认设置,指定核心线程数和最大线程数相同。//此示例将线程池大小限制为 5 个工作线程。ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) { Runnable worker = new ExampleRunnable("" + i); executor.execute(worker);}// 当所有可执行任务都完成后关闭线程池executor.shutdown();// 阻塞当前线程直到关闭操作完成while (!executor.isTerminated()) { }System.out.println("Finished all threads");
以上代码中,新的线程池有默认的限制,而不需要明确地声明线程池的大小或能力 。
线程池固定大小,当队列中没有可以在工作线程上执行的任务时(即阻止列表为空),则该任务将继续等待直到可用。
在每个可用工作线程上使用while循环反复启动一个Runnable任务并让其运行到池的关闭标志被设置
线程池被关闭之后,isTerminated()方法返回true,并退出while循环。
关键词:
-
天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
在最新发布的KruiseRollout0 3 0版本中,我们为大家带来了几个非常有趣的新特性:一是针对Kubernetes...
来源: 天天快讯:Kruise Rollout v0.3.0:教你玩转 Deployment 分批发布和流量灰度
ThreadPool实现机制
焦点热议:nodejs处理嵌套对象的npm包:dot-prop
中国西北地区发现广泛分布的侏罗纪被子植物化石
3年陈花香白牡丹:董德福鼎白茶200g装128元大促(200元券)
环球快看:188GB显存 800W功耗!NVIDIA发布H100 NVL加速卡:ChatGPT提速2倍
世界新资讯:美国两囚犯用牙刷挖洞越狱成功:墙内钢筋松了!职能部门颜面扫地
当前观察:9岁女孩豪掷18.9万打赏游戏主播 偷偷记下密码还删除转账记录
天天速讯:新能源汽车高速没电竟然倒车回服务区充电 后方车辆纷纷避让
Geyser - Minecraft Server 基岩版与Java版互通教程
世界速讯:Rust 知识积累(5)
全球热文:CSIG企业行-走进合合信息成功举行,聚焦生成式人工智能、智能文档处理前沿热点
环球今日讯!webrtc QOS笔记三 RTT计算,SRS增加XR
你可能不那么知道的Tomcat生命周期管理 | 博学谷狂野架构师
全球新资讯:国家药监局:2022年抽检11类化妆品20368批次产品 合格率97.60%
每日速看!【财经分析】投资收益拖累2022年券商业绩 投行业务景气度仍处于高位
【聚看点】澳弘电子(605058.SH):年产高精密度多层板、高密度互连积层板120万平方米建设项目及研发中心升级改造项目结项
真我GT Neo5 SE“最终幻想”配色回归:赛博朋克风满满
当前消息!《黑暗荣耀2》蝉联网飞电视剧全球榜第一:观看时间过亿
当前热门:又一日系即将退出中国?广汽三菱否认传闻:正常运转
世界看点:被谷歌商店下架 拼多多驳斥恶意软件指控!
世界聚焦:上市五年市值缩水99.6%!昔日“明星”趣头条宣布退市
新资讯:火山引擎 VeDI 零售行业解决方案 聚焦精准营销场景提升品牌转化
面试官:ThreadLocal 为什么会内存泄漏吗?是怎么产生的?面试必问!
JavaSE笔记之注解和反射(含案例代码)
当前速递!Android BLE 广播定制
环球报道:关于asp.net core filters生命周期的探究
今头条!北方多地迎沙尘!长春直接下“泥雨”:汽车变泥车
环球速讯:OPPO、小米、vivo联盟:跨品牌一键换机新增第三方应用迁移
最新消息:史上最强骁龙7系 真我GT Neo5 SE跑分过百万:16+1TB存储确认
世界今热点:孤立森林(IForest)代码实现及与PyOD对比
最资讯丨three.js加载环境贴图
天天热讯:java中同步和异步的区别
今日关注:Alphaliner:2月底港口停运船比率达6.4% 增至去年同期3倍
4月上映!《长空之王》新预告出炉:王一博驾驶歼20一飞冲天
世界今头条!自嗨锅自热煲仔饭4桶到手价32.8元:15分钟速烹美食
今年以来最强沙尘来袭!你的城市在下雨 他的城市在下泥
邓紫棋你把我灌醉高音最高是多少?邓紫棋你把我灌醉歌词
苏菲日记是什么?苏菲日记的读后感怎么写?
strict怎么读?strict的反义词是什么?
主题班会的开场白有什么要求?主题班会的开场白怎么写?
河南洛阳旅游景点排名前十名有哪些?河南洛阳美食排行榜前十名
当前简讯:一种基于实时大数据的图指标解决方案
【天天报资讯】智能零售柜商品检测软件(Python+YOLOv5深度学习模型+清新界面)
来了解下GNOME 2 的 Linux 文件管理器 Caja
【状压DP】蒙德里安的梦想
【环球新要闻】害怕开车也不愁 小米汽车新专利:根据驾驶员匹配自动驾驶等级
前沿资讯!漫威《美国队长4:新世界秩序》开拍 片场首曝:“猎鹰”美队来了
每日热门:一语成谶!网传鬼火少年“三部曲”:片头壮行、片尾撞车
俄罗斯伏尔加汽车厂:中国汽车是新款拉达Vesta的主要对手
省钱神器!淘宝内测同款比价功能:最快本周上线
全球速看:记一次 rr 和硬件断点解决内存踩踏问题
天天新资讯:生核桃怎么变熟核桃_生核桃怎么弄熟
魅族20 PRO三款配色公布:绝美朝阳金吸睛
天天快消息!25日继续公测 暴雪承诺《暗黑4》会解决排队问题:服务器顶得住
环球精选!沙尘天气席卷!北京再现火星同款“蓝太阳” 专家揭秘
世界即时:开特斯拉回村被乡亲群嘲“大冤种” 30万买BBA不好吗?
今日热门!微信聊天记录不用头疼了:vivo宣布跨品牌换机数据迁移
基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)
MAC 最新中文版 FCPX 10.6.5 及相关插件下载安装教程 亲测有效
大数据计算引擎 EasyMR:拥抱开源,引领技术创新
当前聚焦:Java面试问题
解放生产力:30+实用AI工具汇总
全球今日讯!谷歌版ChatGPT开放测试:不会编程、不支持中文
全球聚焦:微软研究员质疑Bard数据集包括Gmail邮件:谷歌迅速澄清
2999元 小米米家对开门540L冰箱今晚开售:风冷无霜保鲜
120mg原生高钙 特仑苏纯牛奶3元/盒大促
天天最新:破解大难题!苹果新专利:佩戴太阳镜也可看清iPhone屏幕内容
【报资讯】vue3
世界视点!设计模式-index
精彩看点:商铺上月买卖91宗 涉21亿创半年高
热点评!平板电脑屏幕冷知识:高刷比高分辨率重要
焦点热讯:比尔·盖茨:GPT是1980年以来最革命性的技术进步
今日热讯:极氪009平均订单金额达52.7万元 一台订单收入相当于吉利卖5台
谷歌版ChatGPT Bard开启公测!CEO:肯定会出错、欢迎反馈
世界焦点!漫威《美队4》正式开拍 首曝片场路透:猎鹰美队就位
世界热议:Android性能优化-ListView自适应性能问题
读C#代码整洁之道笔记03_切面关注点、异常处理和线程与并发
当前时讯:放假一天不调休!2023清明节假期火车票今日开售
快资讯丨《霍格沃茨》在线人数锐减 “反恐同”人士冷嘲热讽
环球今日讯!《战争机器》电影确定编剧
世界聚焦:刚买1个月的特斯拉掉漆车主质疑非新车 售后:交付时没问题
热消息:公交司机急刹车致乘客死亡获刑 官方判定当时不需刹车:交通肇事罪
全球最资讯丨新车品鉴:2020广州车展探馆:广汽传祺EMPOWER
每日热闻!【看新股】10家拟上市银行“换道”注册制:利润普遍增长、资产质量分化、资本充足率承压
精选!iOS 17将支持第三方应用商店:看齐安卓
读Java性能权威指南(第2版)笔记24_ Java飞行记录器JFR
洗衣机6个月不清洗比马桶还脏?我麻了
时代的眼泪 25年历史的数码相机权威网站Dpreview关停
当前快报:Go 并发编程(二):锁、Select、Context、定时器
焦点报道:智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)
当前通讯!Servlet的基本使用
每日资讯:中国移动:命苦
天天速看:鹿客发布掌心锁V5:掌静脉+3D结构光刷脸解锁 3399元起
尼泊尔空难20天就查明原因?为什么东航事故还没有结果?
世界微资讯!腾讯四年磨一剑!结果 让大家看笑话了
OPPO Find X6 Pro:表演一场简单的光影魔术
亨迪药业(301211):3月21日北向资金减持66.63万股
世界最资讯丨uni-app云开发入门
当前资讯!WPF学习-布局