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