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");