Android之实现具有优先级的线程池

原创 2015年11月19日 13:57:31

      在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;
    }
}


然后就是为PriorityBlockingQueue构造函数的第二个参数,继承Comparator实现一个比较优先级的类

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 started
2 started
10 finished
5 started
2 finished
4 started
5 finished
3 started
4 finished
3 finished

可以看出核心线程是2个 也就是刚开始进入的10 和 2 , 后面的调用顺序是5、3、4,在队列中经过优先级排列变成了5、4、3

,真正的按照优先级的大小进行排列调用顺序




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

(转)android 设置线程的优先级

一、有两处API可以设置线程的优先级: 1、android.os.Process.setThreadPriority (int priority)       或      android.os...

JAVA线程池的实现 和 优先级设置

import java.util.LinkedList; import java.util.List; /** * * Title: LoonFramework * * * Descri...

JAVA线程池的简单实现及优先级设置

  我们大家都知道,在处理多线程服务并发时,由于创建线程需要占用很多的系统资源,所以为了避免这些不必要的损耗,通常我们采用线程池来解决这些问题。  线程池的基本原理是,首先创建并保持一定数量的线程,当...

基于优先级队列java线程池

背景 最近在看同事的消息平台的问题进行优化,其中一点就是推送来的消息没有区分优先级,造成实时性要求高的不能优先满足,被全网下发的普通优先级占用了,造成消息延迟。 对应的改进一点就是采用把现有线程池...
  • bohu83
  • bohu83
  • 2016年04月26日 14:23
  • 1646

线程池+队列 优先级方式执行队列任务

通过jdk自带ThreadPoolExecutor线程池+队列 实现优先级方式执行线程任务

Android基础总结——进程优先级及提高优先级的方法(Service尽量不死之法)

进程的生命周期Android系统会尽可能长的延续一个应用程序进程,但在内存过低的时候,仍然会不可避免需要移除旧的进程。为了决定哪些进程留下,哪些进程被杀死,系统根据在进程中在运行的组件及组件的状态,为...

android 进程优先级

[这篇文章是我对dev Guide中Processes and Threads的翻译和总结, 也加上了一些个人理解]   android中的进程 默认情况下, 同一个application中的所...
  • fhy_2008
  • fhy_2008
  • 2012年03月07日 15:05
  • 16150

Java/Android中的优先级任务队列的实践

本篇文章适用于Java和Android开发者,会从实现一个最简单的队列过渡到实现一个带有优先级的队列,使用生活中最常见的的例子结合讲解,保准你可以掌握基本的队列原理。...

Android PriorityQueue优先级队列 学习!

import java.io.*; mport java.util.*; public class PQ { public static void main(String[] args) { Pr...

第十章·优先级队列

需求与动机什么是优先级队列 优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之实现具有优先级的线程池
举报原因:
原因补充:

(最多只允许输入30个字)