您的位置:首页 > 移动开发 > Android开发

Android 线程池详解

2018-03-01 11:26 211 查看
                            Android 线程池详解

有很多人都不是多了解线程池,在这里我要做一下详细的解析。
线程池算是Android开发中非常常用的一个东西了,只要涉及到线程的地方,大多数情况下都会涉及到线程池。Android开发中线程池的使用和Java中线程池的使用基本一致。
假如说我想做一个新闻应用,ListView上有一个item,每个item上都有一张图片需要从网络上加载,如果不使用线程池,你可能通过下面的方式来开启一个新线程:

new Thread(new Runnable() {
@Override
public void run() {
//网络访问
}
}).start();

1.使用new Thread()创建线程存在的问题

1.针对每一个item都创建一个新线程,这样会导致频繁的创建线程,线程执行完之后又被回收,又会导致频繁的GC2.这么多线程缺乏统一管理,各线程之间互相竞争,降低程序的运行效率,手机页面卡顿,甚至会导致程序崩溃3.如果一个item滑出页面,则要停止该item上图片的加载,但是如果使用这种方式来创建线程,则无法实现线程停止执行
如果使用线程池,我们就可以很好的解决以上三个问题。

2.使用线程池的好处

1.重用已经创建的好的线程,避免频繁创建进而导致的频繁GC2.控制线程并发数,合理使用系统资源,提高应用性能3.可以有效的控制线程的执行,比如定时执行,取消执行等这篇文章先简单介绍下Android中自带的四种线程池:
1 、newCachedThreadPool

这种线程池比较灵活,也就是说它的池里的线程数量并不是固定的,理论上可以无限大,任务不需要排队,如果有空闲的线程,则复用,无则新建线程。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

}
});
2、newFixedThreadPool

这个算是一个中规中矩,也是Android sdk的源码中用的比较多的,它的池子里的线程数有个最大值,可以自己设置,如果超过这个最大值,那么任务就会加入任务队列去等待。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
fixedThreadPool.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

}
});
3、 newSingleThreadExecutor

如字面意思,这是一个单例化的线程池,他只有一个线程去执行任务。最常见的一个例子就是我们的UI线程啦。它就是典型的单线程模型。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

}
});
4、newScheduledThreadPool

这也是一个定长的线程池,但是可以支持周期性的任务。

以下例子表示延迟一秒过后,每两秒执行一次。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

@Override
public void run() {

}
},1, 2, TimeUnit.SECONDS);
我自己理解看来。
线程池
顾名思义就是一个容器的意思,容纳的就是
Thread
or
Runable

注意:每一个线程都是需要
CPU
分配资源去执行的。如果由于总是
new Thread()
开启一个线程,那么就会大量的消耗
CPU
的资源,导致
Android
运行变慢,甚至OOM(
out of memory
) ,因而
java
就出现了一个
ThreadPoolExecutor
来管理这些线程。控制最多的线程数
maximumPoolSize
, 
核心线程数
corePoolSize
,来管理我们需要开启的线程数。目的:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务所以:我们就可以根据手机的CPU核数来控制
App
可以开的最大线程数。保证程序的合理运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: