Android(安卓)线程池框架、Executor、ThreadPoolExecutor详解
无论是在java还是在Android,其实使用到的线程池都基本是一样的,因此本篇我们将来认识一下Java/Android线程池框架。
Java/Android线程池框架的结构主要包括3个部分
1.任务:包括被执行任务需要实现的接口类:Runnable 或 Callable
2.任务的执行器:包括任务执行机制的核心接口类Executor,以及继承自Executor的EexcutorService接口。
3.执行器的创建者,工厂类Executors
一、Executor 和 ExecutorService
Executor只是一个接口,它是Java/Android线程池框架的基础,它将任务的提交与任务的执行分离开来。
ExecutorService继承自Executor,有两个关键类实现了ExecutorService接口:ThreadPoolExecutor和ScheduledThreadPoolExecutor。
(1)ThreadPoolExecutor 是线程池的核心实现类,用来执行被提交的任务。
(2)ScheduledThreadPoolExecutor 也是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令。它比Timer更灵活,功能更强大。
二、Executors工厂类
Executors是一个工厂类,它不继承任何其它类,它通过ThreadPoolExecutor、ScheduledThreadPoolExecutor创建出四种不同的线程池,分别为:(1)newCachedThreadPool 创建一个可缓存线程池,线程池的最大长度无限制,但如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
Executors.java
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue()); }
使用示例:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int index = i;try {Thread.sleep(index * 1000);} catch (InterruptedException e) {e.printStackTrace();} cachedThreadPool.execute(new Runnable() { @Overridepublic void run() {System.out.println(index);}});}
(2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 Executors.java
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()); }
使用示例:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);for (int i = 0; i < 10; i++) {final int index = i;fixedThreadPool.execute(new Runnable() { @Overridepublic void run() {try {System.out.println(index);Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}
(3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。 Executors.java
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize);}
使用示例:表示延迟3秒执行
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);scheduledThreadPool.schedule(new Runnable() { @Overridepublic void run() {System.out.println("delay 3 seconds");}}, 3, TimeUnit.SECONDS);
使用示例: 表示延迟1秒后每3秒执行一次 scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Overridepublic void run() {System.out.println("delay 1 seconds, and excute every 3 seconds");}}, 1, 3, TimeUnit.SECONDS);
(4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
Executors.java
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue())); }
使用示例:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 10; i++) {final int index = i;singleThreadExecutor.execute(new Runnable() { @Overridepublic void run() {try {System.out.println(index);Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}
更多相关文章
- android实现字体闪烁动画的方法
- 浅析Android中的消息机制-解决:Only the original thread that cr
- 在Fragment中设置控件点击方法,执行失败。
- Android异步消息机制之Handler
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android(安卓)之 AsyncTask 异步任务
- Android之Handler用法总结
- Android(安卓)任务和回退堆栈---启动任务
- Android开发之消息处理机制(一)——Handler