Android 线程池

2019-03-20  本文已影响0人  落叶随风花开半夏

1.含义

线程池用于多线程处理中,它可以根据系统的情况,可以有效控制线程执行的数量,优化运行效果。线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。

2.优缺点

new Thread 的缺点
  1. 每次new thread创建新的对象,性能差
  2. 线程缺乏统一管理,能无限创建新线程,造成资源过多占用(死机)或OOM
  3. 缺乏更多功能,如:定时执行,定期执行,线程中断
java提供的线程池的优点
  1. 重用存在的线程,减少线程创建,销毁的销毁,性能佳
  2. 可有效的控制线程并发的最大数,提高资源使用率,同时避免过多资源竞争,避免堵塞。
  3. 提供定时执行、定期执行、单线程、并发控制等功能

3.实现类

ThreadPoolExecutor类 = 线程池的真正实现类

开发者可根据不同需求 配置核心参数,从而实现自定义线程池

// 创建线程池对象如下
// 通过 构造方法 配置核心参数
Executor executor = new ThreadPoolExecutor( 
                                          CORE_POOL_SIZE,
                                          MAXIMUM_POOL_SIZE,
                                          KEEP_ALIVE,
                                          TimeUnit.SECONDS, 
                                          sPoolWorkQueue,
                                          sThreadFactory 
                                           );

// 构造函数源码分析
public ThreadPoolExecutor (int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

构造方法里面参数意义作用

  1. corePoolSize: 线程池中核心线程的数量。

  2. maximumPoolSize: 线程池中最大线程数量。

  3. keepAliveTime: 非核心线程的超时时长,超过该时长,非核心线程就会被回收。 如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,则该参数也表示核心线程的超时时长。

  4. unit: keepAliveTime这个参数的单位,有纳秒、微秒、毫秒、秒、分、时、天等。

  5. workQueue: 线程池中的任务队列,该队列主要用来存储已经被提交但是尚未执行的任务。存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的。

  6. threadFactory: 为线程池提供创建新线程的功能,这个我们一般使用默认即可。

  7. handler: 拒绝策略,当线程无法执行新任务时(一般是由于线程池中的线程数量已经达到最大数或者线程池关闭导致的),默认情况下,当线程池无法处理新线程时,会抛出一个RejectedExecutionException。

任务队列

LinkedBlockingQueue:

LinkedBlockingDeque

PriorityBlockingQueue

LinkedTransferQueue

handler拒绝策略

线程池对拒绝任务的处理策略。一般是队列已满或者无法成功执行任务,这时ThreadPoolExecutor会调用handler的rejectedExecution方法来通知调用者

ThreadPoolExecutor默认有四个拒绝策略:
1、ThreadPoolExecutor.AbortPolicy()   直接抛出异常RejectedExecutionException
2、ThreadPoolExecutor.CallerRunsPolicy()    直接调用run方法并且阻塞执行
3、ThreadPoolExecutor.DiscardPolicy()   直接丢弃后来的任务
4、ThreadPoolExecutor.DiscardOldestPolicy()  丢弃在队列中队首的任务

4.常见的4类功能线程池

根据参数的不同配置,Java中最常见的线程池有4类:

  1. 定长线程池(FixedThreadPool)
  2. 定时线程池(ScheduledThreadPool )
  3. 可缓存线程池(CachedThreadPool)
  4. 单线程化线程池(SingleThreadExecutor)

即 对于上述4类线程池,Java已根据 应用场景 配置好核心参数

4.1 定长线程池(FixedThreadPool)
4.2 定时线程池(ScheduledThreadPool )
4.3 可缓存线程池(CachedThreadPool)

任何线程任务到来都会立刻执行,不需要等待

4.4 单线程化线程池(SingleThreadExecutor)
上一篇 下一篇

猜你喜欢

热点阅读