服务外包Java Timer和TimerTask实例教程
java.util.TimerTask是一个形象类,它完成了Runnable接口。咱们需求扩充该类以便创建本人的TimerTask,这个TimerTask内部利用java Timer类,可能被调度。
TimerTask started Timer task started at:Mon Mar 04 22:68:24 CST 2024 Timer task finished at:Mon Mar 04 22:68:44 CST 2024 Timer task started at:Mon Mar 04 22:68:44 CST 2024 Timer task finished at:Mon Mar 04 22:60:04 CST 2024 Timer task started at:Mon Mar 04 22:60:04 CST 2024 Timer task finished at:Mon Mar 04 22:60:24 CST 2024 Timer task started at:Mon Mar 04 22:60:24 CST 2024 Timer task finished at:Mon Mar 04 22:60:44 CST 2024 Timer task started at:Mon Mar 04 22:60:44 CST 2024 Timer task finished at:Mon Mar 04 24:00:04 CST 2024 Timer task started at:Mon Mar 04 24:00:04 CST 2024 TimerTask cancelled Timer task finished at:Mon Mar 04 24:00:24 CST 2024输出结果证明,假设一个义务已经执行,Timer将期待它执行完结,一旦义务执行完结,Timer对象将再次启动队列中的下一个义务。
Timer类利用对象的wait和notify方法来调度义务。
java.util.Timer是一个适用工具类,该类用来调度一个线程,使它可能在将来某一时辰执行。 Java的Timer类可能调度一个义务运转一次,或定期运转。
译文链接:Timer类蕴含一些sechedule()方法用于调度一个义务在指定时间运转一次或许延时之后运转。还有一些scheduleAtFixedRate()方法用于在肯定间隔后周期运转义务
Timer类是线程平安的,多过程不需求外部同步机制就可能共享同一个Timer对象。Timer类利用java.util.TaskQueue在指定时间间隔减少义务,在任何时辰只能有一个线程执行TimerTask。例如,创建一个每20秒运转的Timer,德语翻译,但单个线程的执行时间花费20秒,Timer对象将继续将义务减少到队列,一旦有义务完结,它就会通知队列,并且另外一个线程将启动执行。
原文链接: journaldev 翻译: ImportNew字符串 - liken
package com.journaldev.threads; 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, 20*2000); System.out.println("TimerTask started"); //cancel after sometime try { Thread.sleep(220000); } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); System.out.println("TimerTask cancelled"); try { Thread.sleep(40000); } catch (InterruptedException e) { e.printStackTrace(); } } }
留意,一个线程执行花费20秒,但Timer对象每20秒就调度一次义务。如下是程序的输出。
Timer对象可作为一个守护线程运转相干的义务。Timer的cancel()方法用于终止计时器,并抛弃待调度的义务。但是,Timer不会干扰以后执行的义务,并且让它执行完结。假设计时器用于执行守护线程,无论能否勾销它,它都会期待一切用户线程完结后终止。
[ 转载请保留原文出处、译者和译文链接。]如下是一个利用Timer和TimerTask的实例。
当利用Timer调度义务时,必须确保时间间隔超过失常程序运转时间,否则义务队列的大小将继续增长,最终程序将无奈中止。
关于作者: liken
(新浪微博:@lihenair)