07-案例实现
案例实现
根据如下步骤来实现本案例。
1.新建一个 MyPriorityTask 类,实现 Runnable 和 Comparable 接口:
public class MyPriorityTask implements Runnable,
Comparable<MyPriorityTask> {
2.声明一个整型私有变量 priority :
private int priority;
3.声明一个字符型私有变量 name :
private String name;
4.实现该类的一个构造方法来初始化其字段:
public MyPriorityTask(String name, int priority) {
this.name=name;
this.priority=priority;
}
5.实现一个方法来返回优先级字段值:
public int getPriority(){
return priority;
}
6.实现在 Comparable 接口中声明的 compareTo() 方法。它不仅会接收一个 MyPriorityTask 对象作为参数,还会比较两个对象(当前对象和参数对象)的优先级。可以令较高优先级的任务比低优先级的更早地执行:
@Override
public int compareTo(MyPriorityTask o) {
return Integer.compare(o.getPriority(), this.getPriority());
}
7.实现 run() 方法。使当前线程休眠2s:
@Override
public void run() {
System.out.printf("MyPriorityTask: %s Priority : %d\n",
name,priority);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
8.实现本案例的主类,新建 Main 类和 main() 方法:
public class Main {
public static void main(String[] args) {
9.创建一个名为 executor 的 ThreadPoolExecutor 对象。使用 PriorityBlocking-Queue ,且其泛型参数为 Runnable 接口,这就是让该执行器通过队列来存储等待中的任务:
ThreadPoolExecutor executor=new ThreadPoolExecutor(4,4,1,
TimeUnit.SECONDS,
new PriorityBlockingQueue<Runnable>());
10.传递10个任务到执行器中,并使用循环计数作为任务的优先级。使用 execute() 方法来传递任务到执行器中:
for (int i=0; i<10; i++){
MyPriorityTask task=new MyPriorityTask ("Task "+i,i);
executor.execute(task);
}
11.使当前线程休眠1s:
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
12.传递另外10个任务到执行器,并使用循环计数作为任务的优先级。用 execute() 方法来传递任务到执行器中:
for (int i=10; i<20; i++) {
MyPriorityTask task=new MyPriorityTask ("Task "+i,i);
executor.execute(task);
}
13.用 shutdown() 方法来关闭该执行器:
executor.shutdown();
14.用 awaitTermination() 方法来等待该执行器最终执行完成:
try {
executor.awaitTermination(1, TimeUnit.DAYS);
} catch (InterruptedException e) {
e.printStackTrace();
}
15.在控制台打印一条代表程序最终执行完成的信息:
System.out.printf("Main: End of the program.\n");