Android之线程池

 http://www.trinea.cn/android/java-android-thread-pool/

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用。本文是基础篇,后面会分享下线程池一些高级功能。

1、new Thread的弊端
执行一个异步任务你还只是如下new Thread吗?

new Thread(new Runnable() { 	
@Override	
public void run() {		
// TODO Auto-generated method stub	
}}).start(); 

 

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

 

2、Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
}
});
}


 

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

 

(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}


 

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。

 

(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {  
@Override
public void run() {  
System.out.println("delay 3 seconds"); 
}}, 3, TimeUnit.SECONDS); 


 

表示延迟3秒执行。

 

定期执行示例代码如下:

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);


 

表示延迟1秒后每3秒执行一次。

ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。

 

(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute( new Runnable() {   
@Override  public void run() {   
try {    System.out.println(index);    Thread.sleep(2000);   }
catch (InterruptedException e) {    
// TODO Auto-generated catch block    e.printStackTrace();   
}  } });} 


 

结果依次输出,相当于顺序执行各个任务。

现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库自增主键可能产生的问题

在MySQL中经常会配置自增长属性的字段作为主键&#xff0c;特别是使用InnoDB存储引擎&#xff0c;因为InnoDB的聚集索引的特性&#xff0c;使用自增长属性的字段当主键性能更好&#xff0c;但是使用自增主键也可能会带来一些问题。 举个例子&#xff0c;使用自增主键对数据库做…

js中的hasOwnProperty和isPrototypeOf方法

转自&#xff1a;http://www.cnblogs.com/jenry/archive/2010/12/08/1900150.html hasOwnProperty&#xff1a;是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是&#xff0c;此方法无法检查该对象的原型链中是否具有该属性&#xff0c;该属性必须是对象本身的…

2021,我在枯燥乏味中寻找坚持下去的理由

这是头哥侃码的第248篇原创2021年&#xff0c;因为疫情和工作变更的关系&#xff0c;不仅我的工作方式被彻底改变&#xff08;居家远程办公&#xff09;&#xff0c;而且还在健身房悟出一个心得体会。啥心得&#xff1f;啥体会&#xff1f;那就是觉得人生逐渐变得没有意思。不知…

OM 延交訂單

如訂單扣數後要延交, 請按以下步驟: 1) 先取消要延交的ITEM 的DELIVERY NO. ACTION: Unassign from Dlivery 2) 要重新給DELIVERY NO ACTION: Auto-create Trip 3) 延交訂單item - Ship confirm - 選backorder all - OK 已完成延交, 可重新取move order

数据挖掘编程语言选择(Python与R的PK)

数据挖掘技术日趋成熟和复杂&#xff0c;随着互联网发展以及大批海量数据的到来&#xff0c;之前传统的依靠spss、SAS等可视化工具实现数据挖掘建模已经越来越不能满足日常需求&#xff0c;依据美国对数据科学家&#xff08;data scientist&#xff09;的要求&#xff0c;想成为…

Android之内存机制分析-Android堆和栈

1、dalvik的Heap和Stack 这里说的只是dalvik java部分的内存&#xff0c;实际上除了dalvik部分&#xff0c;还有native。这个以后再说。 下面针对上面列出的数据类型进行说明&#xff0c;只有了解了我们申请的数据在哪里&#xff0c;才能更好掌控我们自己的程序。 2、对象实例…

这部纪录片带你重新认识中华神州大地,领略你不知道的中国

你对自己的祖国熟悉嘛&#xff1f;你是否真正的去了解过自己祖国的各个省份呢&#xff1f;今天小编带来的这部纪录片《你所不知道的中国》&#xff0c;带你认识一个你从未了解的中国&#xff0c;让你从纪录片的视角去认识自己的祖国&#xff0c;重新认识哺育自己多年的神州大地…

B-树特征

在m阶B-树的定义中&#xff0c;要求&#xff1a; 1、树中每个节点至多有m棵子树。 2、若根节点不是叶子节点&#xff0c;则至少有两棵子树。 3、除根之外的所有非终端节点至少有棵子树。转载于:https://www.cnblogs.com/tonglingliangyong/p/3740964.html

首届微软研究峰会视频上线,快来查收你的独家观看指南!

由微软全球八大研究院携手倾力打造的首届微软研究峰会 Microsoft Research Summit 2021 已于此前在线上成功举办。来自世界各地的 300 余位顶尖科学家和技术领导者为大家带来了 150 场精彩分享&#xff0c;内容围绕“科学、赋能、可持续发展、医疗健康、信任”五大主题展开&…

Linux命令之tree

tree功能说明&#xff1a;以树状图列出目录的内容语法&#xff1a;tree [-aACdDfFgilnNpqstux] [-l <范本样式>] [-p <范本样式>] [目录]补充说明&#xff1a;执行tree指令&#xff0c;它会列出指定目录下的所有文件&#xff0c;包括子目录里的文件参数&#xff1a…

关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时&#xff0c;发现其插入有问题&#xff0c;下面是插入程序&#xff0c;每次插入完成后&#xff0c;节点还是NULL。 template<typename Object>void CMyTree<Object>::insert(const Object& element, BinaryNode<Obje…

当全家人一起看电影,播到羞羞镜头时......

1 我看你好眼熟哦&#xff08;via.松鼠少儿&#xff0c;侵删&#xff09;▼2 妹妹&#xff1a;有没有想过我感受&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 遇见五步蛇怎么办&#xff08;via.阿森不是妖怪&#xff0c;侵删&#xff09;▼4 一年级…

网站分析常用方法

本篇文章我们介绍4种网站分析中最常用&#xff0c;也是最有效的分析方法。他们分别是细分分析&#xff0c;对比分析&#xff0c;对比分析&#xff0c;质与量分析。这些分析方法在实际工作中经常组合使用。我们先来看下细分分析。 1&#xff0c; 细分分析 单一的指标数据或大维度…

Jmeter录制app脚本

前期准备电脑安装Jmeter&#xff1b;手机&#xff1b;wifi;操作步骤&#xff1a;1、启动Jmeter2、“测试计划”中添加“线程组”&#xff1b;3、“工作台”中添加“HTTP代理服务器”&#xff1b;4、配置代理服务器&#xff1a;Global Settings下面的端口配置&#xff1a;9988&a…

PPT设计中的用图问题

好的图片对于PPT的重要性&#xff0c;这已是不争的事实。但是PPT设计者往往不是设计出身&#xff0c;因此在一些PPT案例中图片运用不当也是经常可以看见的&#xff0c;介绍一些图片的基本知识&#xff0c;希望有助于大家更好的理解图片&#xff0c;并且更好地在PPT中运用图片。…

浅谈C++类(1)--概念和构造函数

迎转载&#xff0c;但请标明作者 “九天雁翎”&#xff0c;当然&#xff0c;你给出这个帖子的链接更好。 类多么重要我就不多说了&#xff0c;只讲讲学习&#xff0c;因为个人认为类的学习无论从概念的理解还是实际代码的编写相对其他C兼容向的代码都是比较有难度的&#xff0…

asp.net webapi bug : System.OperationCanceledException 异常处理

asp.net webapi的过滤器 ExceptionFilterAttribute 捕获一个异常消息如下&#xff1a;检测到站点发生错误 "已取消该操作。"错误跟踪: 在 System.Threading.CancellationToken.ThrowIfCancellationRequested() 在 System.Web.Http.Filters.ActionFilterAttribute.d__…

vscode中vue项目报错

当在vscode中写代码时&#xff0c;报错报错报错......... 已经头大&#xff0c;还没写就报错&#xff0c; 这是因为eslint对语法的要求太过严格导致的编译时&#xff0c;出现各种语法格式错误 我们打开vue.config.js&#xff0c;加上这句代码&#xff0c;就OK啦 lintOnSave:…

nginx连接uwsgi使用web.py框架构造pythonweb项目

2019独角兽企业重金招聘Python工程师标准>>> 相关页面&#xff1a;http://webpy.org/installhttp://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.htmlhttp://projects.unbit.it/uwsgi/wiki/Example uwsgi的安装需要python-devel&#xff0c;可以使用yum s…