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