Android中的线程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的线程池相关的知识,希望对你有一定的参考价值。

参考技术A  线程池的好处

1、重用线程池中的线程,避免线程的创建与销毁带来的性能开销

2、能有效控制线程池的最大并发数,避免大量线程因抢占资源而导致的阻塞

3、能对线程进行简单的管理,提供定时或者指定间隔时间、循环执行等操作

线程池的概率来自于java的Executor接口,实现类是ThreadPoolExecutor, 它提供一系列的参数来配置线程池,以此构建不同的线程池。android的线程池分4类,都是通过Executors所提供的工厂方法来得到。

ThreadPoolExecutor有四个构造函数,下面这个是最常用的

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnnable> workQueue, ThreadFactory threadFactory)

corePoolSize

线程池中的核心线程数,默认情况下核心线程会在线程池中一直存活,即使他们处于闲置状态。如果设置ThreadPoolExecutor 中的allowCoreThreadTimeOut = true, 核心线程在等待新任务到来时有超时机制,时间超过keepAliveTime所指定的时间后,核心线程会终止。

maximumPoolSize

最大线程数

keepAliveTime

非核心线程闲置的超时时间,超过这个时间,非核心线程会被回收。核心线程则要看allowCoreThreadTimeOut属性的值。

unit

时间单位

workQueue

线程池中的工作队列

threadFactory

线程工厂,为线程池提供创建新线程的功能。

举个例子,我们常用的okhttp内部也是使用了线程池,它的ThreadPoolExecutor主要是定义在Dispatcher类里面。 使用的是CachedThreadPool。

executorService = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS, SynchronousQueue(), ThreadFactory("okhttp Dispatcher", false))

1、FixedThreadPool

通过Executors的newFixedThreadPool()创建,这是一个线程数量固定的线程池,里面所有的线程都是核心线程。

public static ExecutorService newFixedThreadPool(int nThreads)

return new ThreadPoolExecutor(nThreads, nThreads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())



2、CachedThreadPool

通过Executors的newCacheThreadPool()创建,这是一个线程数量不定的线程池,里面所有的线程都是非核心线程。最大线程数是无限大,当线程池中的线程都处于活动状态时,新的task会创建新的线程来处理,否则就使用空闲的线程处理,所有的线程都是60s的超时时间,超时后会自动回收。

public static ExecutorService newFixedThreadPool()

return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())



3、ScheduledThreadPool

通过Executors的newScheduledThreadPool()创建, 核心线程固定,非核心线程无限大,当非核心线程空闲时,会立即被回收。适合做定时任务或者固定周期的重复任务。

public static ExecutorService newScheduledThreadPool(int corePoolSize)

return new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.SECONDS, new DelayedWorkQueue())



4、SingleThreadExcecutor

通过Executors的newSingleThreadPool()创建,内部只有一个核心线程。

public static ExecutorService newFixedThreadPool()

return new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())



课外知识:LinkedBlockingQueue

LinkedBlockingQueue是由链表组成的阻塞队列,内部head 指向队列第一个元素,last指向最后一个元素。入队和出队都会加锁阻塞,都是使用了不同的锁。

DelayedWorkQueue

延时队列,队内元素必须是Delayed的实现类。对内元素会按照Delayed时间进行排序,对内元素只有在delayed时间过期了才能出队。

入队的时候不阻塞队列,出队的时候,如果队列为空或者队列里所有元素都等待时间都没有到期,则该线程进入阻塞状态。

以上是关于Android中的线程池的主要内容,如果未能解决你的问题,请参考以下文章

Android(java)学习笔记267:Android线程池

Android中的线程池

如何终止 android线程池中的任务

Android进阶知识——Android线程和线程池

Android进阶知识——Android线程和线程池

Android进阶知识——Android线程和线程池