Android 开发 ThreadPool(线程池) 总结
本文是介绍线程池的基础篇。
一、线程池的作用
创建异步线程的弊端:
1、每次new Thread创建对象,导致性能变差。
2、缺乏统一的管理,可能导致无限制的线程运行,严重的后果就是OOM 或者死机。
使用线程池的有点:
1、重用性大,减少对象的创建,提高性能。
2、可有效控制并发线程数,提高系统资源利用率,避免资源争夺。
3、可提供多种功能:定时、循环、并发、单一等功能。
三、ExecutorService 线程池
Java通过Executors提供了四类常用的线程池。
1、newCachedThreadPoll
定义一个线程池,当线程池里面有可复用的线程,重用线程执行,如果没有,新建线程执行。线程池容量可以无线大。
ExecutorService cacheThread = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
cacheThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
2、newSingleThreadExecutor
创建一个线程池,只有唯一的一个活动的工作线程,有序(FIFO,LIFO,优先级等顺序)的处理队列中的任务。
ExecutorService singleExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 100; i++) {
singleExecutor.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
3、newFixedThreadPool
定义一个可用并发数的线程池,超过并发数的线程,在队列里面等待。
ExecutorService fixedThread = Executors.newFixedThreadPool(3);
for(int i = 0; i < 100 ; i ++){
fixedThread.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
4、newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
ScheduledExecutorService scheduledThread = Executors.newScheduledThreadPool(3);
//延时执行
scheduledThread.schedule(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 2*1000, TimeUnit.SECONDS);
//固定的间隔执行,不受任何影响
scheduledThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
//当线程执行完毕后的,开始计算时间间隔再次执行
scheduledThread.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 10*1000, 1*1000, TimeUnit.SECONDS);
四、AnsyncTask异步线程
提供两个线程池:
1、THREAD_POOL_EXECUTOR异步线程池
2、SERIAL_EXECUTOR同步线程池
使用方式:
new AsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 0);
注意:
1、当默认使用AsyncTask.execute()执行异步任务,默认使用SERIAL_EXECUTOR.
2、SERIAL_EXECUTOR是在THREAD_POOL_EXECUTOR基础上,加一个task的集合来维护顺序的。
最新文章
- libvirt 安装篇
- 正则表达式/g与/i及/gi的意义
- HTML实体符号代码速查表
- java学习:Hibernate入门
- 如何做好IT运营.
- oracel数据泵的使用
- ubuntu下php5扩展mysqli
- The first day,I get a blogs!!
- 洛谷 P1486 [NOI2004]郁闷的出纳员【Treap】题解+AC代码
- Javascript面向对象编程(三):非构造函数的继承
- SQL Server中表锁定的原理及解锁演示
- java 实现一个beautiful的弹层和具体功能
- 在 2016 年学 JavaScript 是一种什么样的体验?(React从入门到放弃)
- Java时代即将来临
- HTC T329手机如何删除系统自带的软件?HTC一键解锁、获取ROOT权限、豌豆荚删除系统软件
- 1111 Online Map (30 分)
- pch文件配置
- 洛谷 P1350 车的放置
- 详谈AngularJS的Directive
- PHP 快速建立一个对象