目录
前言
一般执行器使用阻塞队来存储等待的任务,这些任务都是根据入队顺序存储在执行器中的。一种可行的替代方案就是使用优先队列来替代阻塞队列,这样执行器在执行任务的时候就可以根据优先级来执行任务了。
一、主程序
package xyz.jangle.thread.test.n8_3.priorityexecutor;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 8.3、实现基于优先级的Executor类
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月21日 下午5:49:33
*
*/
public class M {
public static void main(String[] args) throws Exception {
// 使用优先队列来创建线程池
var pool = new ThreadPoolExecutor(4, 4, 1, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>());
for (int i = 0; i < 10; i++) {
var task = new MyPriorityTask("task" + i, i);
pool.execute(task);
}
TimeUnit.SECONDS.sleep(1);
for (int i = 10; i < 20; i++) {
var task = new MyPriorityTask("task" + i, i);
pool.execute(task);
}
pool.shutdown();
pool.awaitTermination(1, TimeUnit.DAYS);
}
}
二、实现Comparable接口的任务
package xyz.jangle.thread.test.n8_3.priorityexecutor;
import java.util.concurrent.TimeUnit;
/**
* 一个包含优先级的任务
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年9月21日 下午5:59:38
*
*/
public class MyPriorityTask implements Runnable, Comparable<MyPriorityTask> {
private String name;
private Integer priority;
public MyPriorityTask(String name, Integer priority) {
super();
this.priority = priority;
this.name = name;
}
@Override
public int compareTo(MyPriorityTask o) {
return Integer.compare(o.getPriority(), this.getPriority());
}
@Override
public void run() {
System.out.println("MyPriorityTask:" + name + ":" + priority);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public Integer getPriority() {
return priority;
}
}
三、执行结果
MyPriorityTask:task1:1
MyPriorityTask:task2:2
MyPriorityTask:task0:0
MyPriorityTask:task3:3
MyPriorityTask:task19:19
MyPriorityTask:task18:18
MyPriorityTask:task17:17
MyPriorityTask:task16:16
MyPriorityTask:task15:15
MyPriorityTask:task14:14
MyPriorityTask:task13:13
MyPriorityTask:task12:12
MyPriorityTask:task11:11
MyPriorityTask:task10:10
MyPriorityTask:task8:8
MyPriorityTask:task9:9
MyPriorityTask:task6:6
MyPriorityTask:task7:7
MyPriorityTask:task5:5
MyPriorityTask:task4:4