自定义线程池
Android中常用的线程池就上面的四种,其实在Java中还有一种常见的线程池(newSingleThreadScheduledExecutor),其实上面的线程池对于我们开发已经是足够了,不过有时候上面的仍然不能满足我们,这时候我们就需要自定义不同功能的线程池。上面我们也说了线程池功能的不同归根到底还是内部的
BlockingQueue
实现不同,所以,我们要实现我们自己相要的线程池,就必须从BlockingQueue(阻塞队列)的实现上做手脚。
那么我们接下来就用
PriorityBlockingQueue来实现一个FIFO的线程池。
1)创建一个基于PriorityBlockingQueue的线程池
- ExecutorService priorityThreadPool = new ThreadPoolExecutor(3,3,0L,TimeUnit.SECONDS,new PriorityBlockingQueue());
2)创建一个实现Runnable接口的类,并向外提供我们实现自定义功能,并实现Comparable接口
- public abstract class PriorityRunnable implements Runnable, Comparable {
- private int priority;
- public PriorityRunnable(int priority) {
- if (priority 0)
- throw new IllegalArgumentException();
- this.priority = priority;
- }
- @Override
- public int compareTo(PriorityRunnable another) {
- int my = this.getPriority();
- int other = another.getPriority();
- return my 1 : my > other ? -1 : 0;
- }
- @Override
- public void run() {
- doSth();
- }
- public abstract void doSth();
- public int getPriority() {
- return priority;
- }
- }
3)使用PriorityRunnable提交任务
- ExecutorService priorityThreadPool = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.SECONDS, new PriorityBlockingQueue());
- for (int i = 1; i 10; i++) {
- final int priority = i;
- priorityThreadPool.execute(new PriorityRunnable(priority) {
- @Override
- public void doSth() {
- //做点事儿
- }
- });
- }