JAVA中如重置时间_可重置Java定时器

根据Timer文档,在Java 1.5之后,你应该更喜欢ScheduledThreadPoolExecutor 。 (你可能喜欢使用Executors .newSingleThreadScheduledExecutor()来创build这个执行Executors以方便使用;它创build了一个很像Timer东西。

很酷的是,当你调度任务(通过调用schedule() )时,它返回一个ScheduledFuture对象。 您可以使用它来取消计划的任务。 然后你可以自由地提交一个不同的触发时间的新任务。

ETA:链接到的Timer文档没有提到有关ScheduledThreadPoolExecutor任何信息,但OpenJDK版本有这样的说法:

Java 5.0引入了java.util.concurrent包,其中的一个并发实用程序是ScheduledThreadPoolExecutor ,它是一个以给定速率或延迟重复执行任务的线程池。 它实际上是Timer / TimerTask组合的更多function的替代品,因为它允许多个服务线程,接受各种时间单位,并且不需要子类化TimerTask (只实现Runnable )。 用一个线程configurationScheduledThreadPoolExecutor使其等价于Timer 。

如果你的Timer只有一个任务执行,那么我会build议inheritance它:

import java.util.Timer; import java.util.TimerTask; public class ReschedulableTimer extends Timer { private Runnable task; private TimerTask timerTask; public void schedule(Runnable runnable, long delay) { task = runnable; timerTask = new TimerTask() { @Override public void run() { task.run(); } }; this.schedule(timerTask, delay); } public void reschedule(long delay) { timerTask.cancel(); timerTask = new TimerTask() { @Override public void run() { task.run(); } }; this.schedule(timerTask, delay); } }

你将需要在代码上添加错误使用检查,但它应该达到你想要的。 ScheduledThreadPoolExecutor似乎并不支持重新调度现有任务,但类似的方法也应该在那里工作。

整个代码片段是这样的….我希望这将是帮助完整

{ Runnable r = new ScheduleTask(); ReschedulableTimer rescheduleTimer = new ReschedulableTimer(); rescheduleTimer.schedule(r, 10*1000); public class ScheduleTask implements Runnable { public void run() { //Do schecule task } } class ReschedulableTimer extends Timer { private Runnable task; private TimerTask timerTask; public void schedule(Runnable runnable, long delay) { task = runnable; timerTask = new TimerTask() { public void run() { task.run(); } }; timer.schedule(timerTask, delay); } public void reschedule(long delay) { System.out.println("rescheduling after seconds "+delay); timerTask.cancel(); timerTask = new TimerTask() { public void run() { task.run(); } }; timer.schedule(timerTask, delay); } } }

你需要安排一个循环任务吗? 在这种情况下,我build议你考虑使用Quartz 。

我不认为可以用Timer/TimerTask ,但是根据你想要达到的目标,你可能会喜欢使用java.util.concurrent.ScheduledThreadPoolExecutor 。

这是我正在尝试。 我有一个类每60秒使用一个TimerTask轮询一个数据库。

在我的主类中,我保留了Timer的实例以及TimerTask的本地子类的一个实例。 主类有一个设置轮询间隔的方法(比如从60到30)。 在它中,我取消了我的TimerTask(这是我的子类,在那里我重写了cancel()方法做一些清理,但这应该不重要),然后使其为空。 我重新创build它的一个新的实例,并在现有的计时器中以新的时间间隔安排新的实例。

由于Timer本身并没有被取消,所以它使用的线程仍然保持活动状态(其他任何TimerTasks也是如此),而旧的TimerTask被replace为一个新的,但碰巧是相同的,但是VIRGIN旧的将被执行或计划,它不再是VIRGIN,根据需要调度)。

当我想closures整个计时器,我取消和空的TimerTask(同样,当我改变了时间,再次,清理资源在我的子类的TimerTask),然后我取消和空的计时器本身。

这里是Resetable Timer的例子。 尝试改变它为您的方便…

package com.tps.ProjectTasks.TimeThread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; /** * Simple demo that uses java.util.Timer to schedule a task to execute * every 5 seconds and have a delay if you give any input in console. */ public class DateThreadSheduler extends Thread { Timer timer; BufferedReader br ; String data = null; Date dNow ; SimpleDateFormat ft; public DateThreadSheduler() { timer = new Timer(); timer.schedule(new RemindTask(), 0, 5*1000); br = new BufferedReader(new InputStreamReader(System.in)); start(); } public void run(){ while(true){ try { data =br.readLine(); if(data != null && !data.trim().equals("") ){ timer.cancel(); timer = new Timer(); dNow = new Date( ); ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Modified Current Date ------> " + ft.format(dNow)); timer.schedule(new RemindTask(), 5*1000 , 5*1000); } }catch (IOException e) { e.printStackTrace(); } } } public static void main(String args[]) { System.out.format("Printint the time and date was started...\n"); new DateThreadSheduler(); } } class RemindTask extends TimerTask { Date dNow ; SimpleDateFormat ft; public void run() { dNow = new Date(); ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); System.out.println("Current Date: " + ft.format(dNow)); } }

这个例子打印每5秒的当前date和时间…但是,如果你在控制台给任何input计时器将延迟执行给定的input任务…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值