当前位置:嗨网首页>书籍在线阅读

07-案例实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

案例实现

根据如下步骤来实现本案例。

1.新建一个 MyPriorityTask 类,实现 RunnableComparable 接口:

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.创建一个名为 executorThreadPoolExecutor 对象。使用 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");