您的位置:首页 > 编程语言 > Java开发

Core Java Tutorial -- Timer Thread

2018-04-01 07:24 246 查看
Java
java.util.Timer
是一个使用程序类,可用于安排将来某个时间执行的线程。Java Timer 类可用于安排一次于运行的任务或定期运行的任务。

Java TimerTask

java.util.TimerTask
是一个实现 Runnable 接口的静态类,我们需要去扩展这个类来创建我们自己的 使用 Timer 类进行调度的 TimerTask。

Java Timer Example

Java Timer 类是线程安全的,多线程可以共享一个 Timer 对象,而无需外部同步。Timer 类使用
java.util.TaskQueue
按给定的时间间隔添加任务,并且任何时候都只能有一个线程于运行 TimerTask,栗如,如果要创建一个每 10 秒运行一次的定时器,单线程执行需要 20 秒,那么 Timer 对象将继续向队列中添加任务,一旦一个线程完成,它将通知队列,另一个线程将开始执行。

Java Timer 类使用 Object wait 和 notify 方法来调度任务。

package Thread;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {

@Override
public void run() {
System.out.println("Timer task started at:" + new Date());
completeTask();
System.out.println("Timer task finished at:" + new Date());
}

private void completeTask() {
try {
//assuming it takes 20 secs to complete the task
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String args[]) {
TimerTask timerTask = new MyTimerTask();
//running timer task as daemon thread
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10 * 1000);
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


注意,一个线程执行需要 20 秒,但 Java Timer 对象计划每 10s 运行一次任务。这是输出:

TimerTask started
Timer task started at:Sun Apr 01 07:21:52 CST 2018
Timer task finished at:Sun Apr 01 07:22:12 CST 2018
Timer task started at:Sun Apr 01 07:22:12 CST 2018
Timer task finished at:Sun Apr 01 07:22:32 CST 2018
Timer task started at:Sun Apr 01 07:22:32 CST 2018
Timer task finished at:Sun Apr 01 07:22:52 CST 2018
Timer task started at:Sun Apr 01 07:22:52 CST 2018
Timer task finished at:Sun Apr 01 07:23:12 CST 2018
Timer task started at:Sun Apr 01 07:23:12 CST 2018
Timer task finished at:Sun Apr 01 07:23:32 CST 2018
Timer task started at:Sun Apr 01 07:23:32 CST 2018
TimerTask cancelled
Timer task finished at:Sun Apr 01 07:23:52 CST 2018


输出确认如果一个任务已经执行,Timer将等待它完成,一旦完成,它将再次从队列中开始下一个任务。

可以创建 Java Timer 对象来将相关任务作为守护程序线程运行。定时器 cancel() 方法用于终止定时器并放弃所有计划任务,但它不会干扰当前正在执行的任务并让其完成。如果定时器作为守护进程线程运行,那么无论我们是否取消它,它将在所有用户线程完成执行后立即终止。

Timer 类包含多个 schedule() 方法,用于安排任务在给定日期或延迟一段时间后运行一次有几个scheduleAtFi
4000
xedRate() 方法以一定的时间间隔周期性地运行任务。

在使用Timer调度任务时,应确保时间间隔比正常线程执行时间要长,否则任务队列大小将保持增长,最终任务将始终执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: