在安卓开发中为了复用线程以及节约线程开销,线程池是一种比较多的方法,有时也会有这样的需求,不同的线程执行任务的紧急程度不一样的,加入线程池的任务可能需要优先处理,在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