当前位置: 首页 > news >正文

android线程池不工作了,Android线程篇(二):Java线程池

8f58901f04bd

为什么要使用线程池呢?

我们知道线程的创建和销毁是非常耗费资源的,有时候创建线程消耗的资源比执行任务所要耗费的资源都要大,为了防止资源不足,程序需要一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是Java线程池产生的原因,也是它要解决的问题。

下面来讲解Java线程池

Java通过Executors提供了四类线程池:

newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待,如果线程池中的某个线程由于异常而结束,线程池则会再补充一条新线程。

For example:

//创建线程数为5的线程池

var myPool=Executors.newFixedThreadPool(5)

for (i in 0 until 10){

myPool.execute(Runnable {

Thread.sleep(500)

println("<<<<

})

}

Log:

8f58901f04bd

image.png

结论:

任务在1-5个线程执行

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

延迟2秒后执行线程

var myPool=Executors.newScheduledThreadPool(5)

myPool.schedule(Runnable {

println("<<<<

},2,TimeUnit.SECONDS)

延迟1秒后执行线程,之后美俩秒执行一次

var myPool=Executors.newScheduledThreadPool(5)

myPool.scheduleAtFixedRate(Runnable {

println("<<<<

},1,2,TimeUnit.SECONDS)

Log:

8f58901f04bd

image.png

newSingleThreadExecutor:创建一个单线程的线程池,即这个线程池永远只有一个线程在运行,这样能保证所有任务按指定顺序来执行。如果这个线程异常结束,那么会有一个新的线程来替代它。

var myPool=Executors.newSingleThreadExecutor()

for (i in 0 until 10){

myPool.execute(Runnable {

Thread.sleep(500)

println("<<<<

})

}

Log:

8f58901f04bd

newCachedThreadPool:创建一个可缓存线程池,当线程池中有之前创建的可用线程就重用之前的线程,否则就新建一条线程,。如果线程池中的线程在60秒未被使用,就会把它从线程池中移除,可灵活回收空闲线程。

var myPool=Executors.newCachedThreadPool()

for (i in 0 until 10){

myPool.execute(Runnable {

Thread.sleep(500)

println("<<<<

})

}

Log:

8f58901f04bd

好了,四种线程池就讲到这里,下篇文章讲解,Java线程池实现原理

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CSDN Oracle电子杂志创刊号发布
  • android应用程序开发(第二版)课后习题答案.doc,android移动应用开发习题答案.pdf
  • android item设置,listview怎样设置每个Item的高度?
  • realone 启动报错之解决方法
  • 360 os android m,360 OS让手机能玩三个系统 “搞机”者的福音
  • 鸿蒙系统适配设备,鸿蒙系统并不只适配手机,志在万物互联!
  • 好消息---Gmail增加免费POP3支持
  • android 设备异常,尝试在android studio上运行设备时出现NullPointer异常
  • android main 日志 中dalvikvm 虚拟机日志,Android系统的安全设计与架构
  • 今天将要去天津转转 还是第一次去
  • html 判断字段数据值赋值,jquery如何判断数据类型是否是字符串?
  • 使用SMTP协议发送邮件
  • 华为鸿蒙取代不了安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  • [讨论]在.NET下获取硬盘序列号的问题
  • html input range修改,HTML Input Range value用法及代码示例
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Studio:GIT提交项目到远程仓库
  • ESLint简单操作
  • IP路由与转发
  • Object.assign方法不能实现深复制
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SQLServer之创建显式事务
  • Theano - 导数
  • 分布式事物理论与实践
  • 力扣(LeetCode)56
  • 批量截取pdf文件
  • 深度解析利用ES6进行Promise封装总结
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 微信小程序:实现悬浮返回和分享按钮
  • 一个项目push到多个远程Git仓库
  • 怎样选择前端框架
  • raise 与 raise ... from 的区别
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​学习一下,什么是预包装食品?​
  • #QT项目实战(天气预报)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (初研) Sentence-embedding fine-tune notebook
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (生成器)yield与(迭代器)generator
  • (十)c52学习之旅-定时器实验
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bat批处理(一):@echo off
  • .mysql secret在哪_MySQL如何使用索引
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core中Emit的使用
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET6实现破解Modbus poll点表配置文件
  • .NET项目中存在多个web.config文件时的加载顺序