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

在安卓开发中为了复用线程以及节约线程开销,线程池是一种比较多的方法,有时也会有这样的需求,不同的线程执行任务的紧急程度不一样的,加入线程池的任务可能需要优先处理,在ThreadPoolExector的构造函数需要传递一个继承BlockQueue的子类。

在SDK中已经提供一个PriorityBlockQueue这样的优先级阻塞队列,我们要的就是扩展Runnable,添加一个优先级的属性

public class RunWithPriority implements Runnable{
	public int priority;
	@Override
	public void run(){
	}
	public RunWithPriority(int priority){
	    this.priority=priority;
	}
	public int getPriority()
	    return priority;
	}
}

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

import java.util.Comparator;

public class ComparePriority implements Comparator<RunWithPriority>{
    @override
    public int compare(RunWithPriority 01,RunWithPriority o2){
        //getPriority值越小,优先级越高,越靠前执行
        return o1.getPriority()-02.getPriority();
    }
}

后面我们写主要代码

PriorityBLockingQueue queue=new PriorityBLockingQueue<>(initialCapacity:20,new ComparePriority());
Executor exe=new ThreadPoolExecutor(corePoolSize:2,maximumPoolSize:16,
keepAliveTime:10000,TimeUnit.SECONDS,queue){
    @Override
    protected void beforeExecute(Thread t,Runnable r){
        super.beforeExecute(t,r);
        Log.d(tag:"lintan",msg:((RunWithPriority)r).getPriority()+"beforeExecute");
    @Override
    protected void afterExecute(Runnable r,Throwable t){
        super.afterExecute(r,t);
        Log.d(tag:"Liying",msg:((RunWithPriority)r).getPriority()+"afterExecute");
    }
};
//RunWithPriority的构造函数中的数字就是优先级大小
exe.execute(new RunWithPriority(99) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(10) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(31) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(45) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(77) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(7) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

exe.execute(new RunWithPriority(1) {
    @Override
    public void run() {
        Log.d("tanlinstarted",this.getPriority() +" started");
        try {
            Thread.sleep(3000);
        }catch (InterruptedException ex) {
        }
        Log.d("tanlin",this.getPriority() +" finished");
    }
});

可以从日志看出来前面优先级99和10这两个是核心线程

后面的线程加入队列进行排序按照优先级数值越小,越执行早。

首先线程池的调度是,系统Cpu利用时间碎片随机去调度的。我们的设置的只能尽可能的去满足,按照优先级去执行,但不能100%保证。


来源链接:https://www.jianshu.com/p/2690d4871c02

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程池是一种常见的并发编程模型,它可以有效地管理和复用线程资源,提高程序的性能和效率。线程池线程池管理器、工作队列和一组工作线程组成。 线程池实现可以遵循以下步骤: 1. 创建线程池管理器:线程池管理器负责创建、初始化和销毁线程池,以及分配任务给工作线程。 2. 创建工作队列:工作队列用于存储待执行的任务。当有新任务到达时,将其添加到工作队列中。 3. 创建工作线程:在线程池初始化时,创建一定数量的工作线程,并让它们等待从工作队列中获取任务。 4. 提交任务:当有任务需要执行时,将任务提交给线程池管理器。管理器会将任务添加到工作队列中,并通知空闲的工作线程去执行任务。 5. 执行任务:空闲的工作线程从工作队列中获取任务,并执行任务的具体逻辑。 6. 销毁线程池:当不再需要线程池时,可以调用销毁方法来释放线程资源。 线程池的意义在于: 1. 提高性能:通过复用线程,避免了频繁创建和销毁线程的开销,减少了系统资源的消耗。 2. 提高响应速度:线程池可以提前创建一定数量的线程,当有任务到达时,可以立即执行,减少了任务等待的时间。 3. 控制并发度:线程池可以限制同时执行的线程数量,避免系统资源被过度占用,提高系统的稳定性。 4. 提供任务队列:线程池通过工作队列来存储待执行的任务,可以有效地管理任务的执行顺序和优先级

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值