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
这种线程池比较灵活,也就是说它的池里的线程数量并不是固定的,理论上可以无限大,任务不需要排队,如果有空闲的线程,则复用,无则新建线程。
这个算是一个中规中矩,也是Android sdk的源码中用的比较多的,它的池子里的线程数有个最大值,可以自己设置,如果超过这个最大值,那么任务就会加入任务队列去等待。
如字面意思,这是一个单例化的线程池,他只有一个线程去执行任务。最常见的一个例子就是我们的UI线程啦。它就是典型的单线程模型。
这也是一个定长的线程池,但是可以支持周期性的任务。
以下例子表示延迟一秒过后,每两秒执行一次。
注意:每一个线程都是需要
核心线程数
有很多人都不是多了解线程池,在这里我要做一下详细的解析。
线程池算是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);我自己理解看来。
线程池顾名思义就是一个容器的意思,容纳的就是
Threador
Runable,
注意:每一个线程都是需要
CPU分配资源去执行的。如果由于总是
new Thread()开启一个线程,那么就会大量的消耗
CPU的资源,导致
Android运行变慢,甚至OOM(
out of memory) ,因而
java就出现了一个
ThreadPoolExecutor来管理这些线程。控制最多的线程数
maximumPoolSize,
核心线程数
corePoolSize,来管理我们需要开启的线程数。目的:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务所以:我们就可以根据手机的CPU核数来控制
App可以开的最大线程数。保证程序的合理运行
相关文章推荐
- Android 的线程(AsyncTask、HandlerThread、IntentService详解)和线程池
- Android 线程池框架、Executor、ThreadPoolExecutor详解
- Android线程池详解
- Android(线程二) 线程池详解
- android线程池详解(一)
- Android 线程池详解
- Android 线程池详解
- Android 线程池详解
- Android 的线程(AsyncTask、HandlerThread、IntentService详解)和线程池
- Android学习之自带线程池详解
- Android(线程二) 线程池详解
- Android 线程池ThreadPoolExecutor详解
- Android 线程池框架、Executor、ThreadPoolExecutor详解
- 详解Android线程池ThreadPoolExecutor的教程
- Java(Android)线程池详解
- Android中的线程池详解
- Android线程池ThreadPoolExecutor详解
- Android线程池详解
- Android线程池ThreadPoolExecutor参数详解
- android线程池详解之ThreadPoolExecutor剖析(二)