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

25-案例实现

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

案例实现

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

1.创建一个名为 Task 的类,并实现 Runnable 接口:

public class Task implements Runnable {

2.声明一个名为 name 的私有 String 型变量,用来存储任务名称:

private final String name;

3.实现该类的构造方法并初始化变量:

public Task(String name) {
  this.name=name;
}

4.实现 run() 方法。在控制台打印日志,输出当前时间来确认任务是否按照给定周期调度的:

@Override
public void run() {
  System.out.printf("%s: Executed at: %s\n",name,new Date());
}

5.至此,我们可以开始实现应用程序的入口,创建包含 main() 方法的 Main 类:

public class Main {
  public static void main(String[] args) {

6.用 Executors 类的 newScheduledThreadPool() 方法创建 ScheduledExecutor- Service 实例对象,向方法传入1作为参数:

ScheduledExecutorService executor=Executors
                                   .newScheduledThreadPool(1);

7.在控制台打印日志记录的当前时间:

System.out.printf("Main: Starting at: %s\n",new Date());

8.创建一个新的 Task 实例对象:

Task task=new Task("Task");

9.用 scheduledAtFixRate() 方法提交一个对象给执行器。用之前创建的 task 实例对象(包含数字1、数字2和 TimeUnit.SECONDS 常量)作为参数。该方法返回一个 ScheduledFuture 实例对象,可以从该对象中获取任务的执行状态:

ScheduledFuture<?> result=executor.scheduledAtFixedRate(task, 1,
                                          2, TimeUnit.SECONDS);

10.创建一个步长为10的循环,打印至下次任务的剩余时间。在循环中,使用 ScheduledFuture 对象的 getDelay() 方法获取下次任务的时间(毫秒):

for (int i=0; i<10; i++){
  System.out.printf("Main: Delay: %d\n",result
                             .getDelay(TimeUnit.MILLISECONDS));

11.让当前线程休眠500ms:

  try {
    TimeUnit.MILLISECONDS.sleep(500);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

12.调用 shutdown() 方法来终止执行器:

executor.shutdown();

13.让当前线程休眠5s,从而确认所有周期性任务都已经执行完成:

try {
  imeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
  e.printStackTrace();
}

14.打印日志来表明任务已经执行完毕:

System.out.printf("Main: Finished at: %s\n",new Date());