Android之实现具有优先级的线程池
来源:互联网 发布:linux如何访问usb 编辑:程序博客网 时间:2024/06/01 09:44
在Android开发中为了复用线程以及节约线程开销,线程池是使用较多的一种方法,有时也会有这样的需求,不同的线程执行任务的紧急度是不一样的,后加入线程池队列的任务可能需要优先处理,在ThreadPoolExecutor的构造函数中需要传递一个继承BlockQueue的子类。
在SDK中已经提供了一个PriorityBlockingQueue这样的优先级阻塞队列,我们要做的就是扩展Runnable,添加一个优先级的属性
public abstract class RunWithPriority implements Runnable{ public int priority; public RunWithPriority(int priority){ this.priority = priority; } public int getPriority() { return priority; }}
public class ComparePriority<T extends RunWithPriority> implements Comparator<T> { @Override public int compare(T lhs, T rhs) { return rhs.getPriority() - lhs.getPriority(); }}
完成了这个类之后我们就能实际使用了,写一个test类
public class Test { public static void main(String[] args){ //在PriorityBlockingQueue传入比较优先级的规则 PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<>(20,new ComparePriority()); Executor exe = new ThreadPoolExecutor(2,6,10, TimeUnit.SECONDS,queue); //RunWithPriority的构造函数中的数字就是优先级大小 exe.execute(new RunWithPriority(2) { @Override public void run() { System.out.println(this.getPriority() + " started"); try { Thread.sleep(3000); } catch (InterruptedException ex) { } System.out.println(this.getPriority() + " finished"); } }); exe.execute(new RunWithPriority(10) { @Override public void run() { System.out.println(this.getPriority() + " started"); try { Thread.sleep(3000); } catch (InterruptedException ex) { } System.out.println(this.getPriority() + " finished"); } }); exe.execute(new RunWithPriority(5) { @Override public void run() { System.out.println(this.getPriority() + " started"); try { Thread.sleep(3000); } catch (InterruptedException ex) { } System.out.println(this.getPriority() + " finished"); } }); exe.execute(new RunWithPriority(3) { @Override public void run() { System.out.println(this.getPriority() + " started"); try { Thread.sleep(3000); } catch (InterruptedException ex) { } System.out.println(this.getPriority() + " finished"); } }); exe.execute(new RunWithPriority(4) { @Override public void run() { System.out.println(this.getPriority() + " started"); try { Thread.sleep(3000); } catch (InterruptedException ex) { } System.out.println(this.getPriority() + " finished"); } }); }}
我们通过输出log来看
10 started2 started10 finished5 started2 finished4 started5 finished3 started4 finished3 finished
可以看出核心线程是2个 也就是刚开始进入的10 和 2 , 后面的调用顺序是5、3、4,在队列中经过优先级排列变成了5、4、3
,真正的按照优先级的大小进行排列调用顺序
0 0
- Android之实现具有优先级的线程池
- 浅谈android线程的优先级
- Android 线程优先级的比较
- android 设置线程的优先级
- android进程、线程的优先级
- java之中PriorityQueue实现原理(具有优先级的队列)
- HashMap的简单实现,具有线程安全
- JAVA线程池的简单实现及优先级设置
- JAVA线程池的简单实现及优先级设置
- JAVA线程池的简单实现及优先级设置
- JAVA线程池的简单实现及优先级设置
- JAVA线程池的简单实现及优先级设置[转]
- JAVA线程池的简单实现及优先级设置[转]
- JAVA线程池的实现 和 优先级设置
- JAVA线程池的简单实现及优先级设置
- java多线程之线程的优先级
- java多线程之线程的优先级
- (转)android 设置线程的优先级
- android opencv人脸检测程序
- Wireshark
- struts2 配置文件详解
- Android之Broadcast, BroadcastReceiver(广播)
- 加速 SBT 下载依赖库的速度
- Android之实现具有优先级的线程池
- block的简单回调传值
- 用UICollectionView实现无限轮播案列
- 数据结构(Java)——查找和排序(2)
- Android LinearLayout 自动换行
- 设置部分文件不适用ARC机制 - iOS开发
- log4net系列(一)--让日志马上跑起来
- struts2.xml 中result type属性说明
- 什么是冒泡和捕获?