Android 线程池教你怎么合理运用线程

有很多人都不是多了解线程池,在这里我要做一下详细的解析。

线程池算是Android开发中非常常用的一个东西了,只要涉及到线程的地方,大多数情况下都会涉及到线程池。Android开发中线程池的使用和Java中线程池的使用基本一致。

假如说我想做一个新闻应用,ListView上有一个item,每个item上都有一张图片需要从网络上加载,如果不使用线程池,你可能通过下面的方式来开启一个新线程:

new Thread(new Runnable() {

@Override

    public void run() {

//网络访问           

     }

}).start();

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

1.针对每一个item都创建一个新线程,这样会导致频繁的创建线程,线程执行完之后又被回收,又会导致频繁的GC

2.这么多线程缺乏统一管理,各线程之间互相竞争,降低程序的运行效率,手机页面卡顿,甚至会导致程序崩溃

3.如果一个item滑出页面,则要停止该item上图片的加载,但是如果使用这种方式来创建线程,则无法实现线程停止执行

如果使用线程池,我们就可以很好的解决以上三个问题。

使用线程池的好处

1.重用已经创建的好的线程,避免频繁创建进而导致的频繁GC

2.控制线程并发数,合理使用系统资源,提高应用性能

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);  
我自己理解看来。线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 
注意:每一个线程都是需要CPU分配资源去执行的。
如果由于总是new Thread()开启一个线程,那么就会大量的消耗CPU的资源,导致Android运行变慢,甚至OOM(out of memory) ,因而java就出现了一个ThreadPoolExecutor来管理这些线程。控制最多的线程数maximumPoolSize, 
核心线程数corePoolSize,来管理我们需要开启的线程数。

目的:减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务

所以:我们就可以根据手机的CPU核数来控制App可以开的最大线程数。保证程序的合理运行

改天继续写.....

猜你喜欢

转载自blog.csdn.net/nazicsdn/article/details/79807737