运行时修改TimerTask的执行周期
java.util.TimerTask类的执行周期period变量的声明如下:
/**
* Period in milliseconds for repeating tasks. A positive value indicates
* fixed-rate execution. A negative value indicates fixed-delay execution.
* A value of 0 indicates a non-repeating task.
*/
long period = 0;
TimerTask并未提供修改period的公共方法,但我们可以借助java反射修改其值。
public abstract class ReschedulableTimerTask extends TimerTask {
public void setPeriod(long period) {
//缩短周期,执行频率就提高
setDeclaredField(TimerTask.class, this, "period", period);
}
//通过反射修改字段的值
static boolean setDeclaredField(Class<?> clazz, Object obj,
String name, Object value) {
try {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj, value);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
}
测试类
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Tester {
public static void main(String[] args){
ReschedulableTimerTask task=new ReschedulableTimerTask() {
@Override
public void run() {
System.out.println("RunTime:"+new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
};
Timer timer=new Timer();
timer.schedule(task, 2000, 2000);//每两秒执行一次
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
}
//主线程6秒后,更改任务周期
task.setPeriod(1000);//改为每秒执行一次
}
}
如果想通过停止任务再重新调用schedule来安排一个新的执行周期,也是可行的,但是要重新创建TimerTask对象;
因为TimerTask对象在安排执行或者取消执行后,其内部状态(由state指定)已经发生变化,是不可以重新安排执行,
否则会抛出IllegalStateException异常。
引用
public void scheduleAtFixedRate(TimerTask task,
long delay,
long period)
抛出:
IllegalArgumentException - 如果 delay 是负数,或者 delay + System.currentTimeMillis() 是负数。
IllegalStateException - 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。
注意:jdk没有提供setPeriod方法可能是出于线程安全的考虑,
如果你要使用以上的方法在运行时动态修改任务的执行频率,
你要自己保证代码的线程安全。
建议在简单的并且运行时间较短的任务中使用。
分享到:
相关推荐
利用jdk中的timer和timertask来实现,每天定时执行的任务。
NULL 博文链接:https://fly2000.iteye.com/blog/292847
timerTask实现每天定时一段时间内执行定时任务,这个是自己写的代码,有些和我的项目有关,可以删掉,但是其主要的都在里面,我写了注释。
发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况 发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。
环境MyEclipse,tomcat,jdk Spring2定时任务 定时触发
Android Timer TimerTask Handler 三者结合实现 数据更新与View更新的同步。 一个不错的机制。
Android中使用定时器TimerTask类介绍.txt Android中使用定时器TimerTask类介绍.txt
Timer和TimerTask的使用 关于java函数中timer类的相关代码 和使用
spring + jdk TimerTask定时器 完整可运行
1、Timer和TimerTask在调用cancel()取消后不能再执行 schedule语句 2、只能在UI主线程中更新控件/组件。在其他线程中,更新控件/组件 https://blog.csdn.net/qq_31939617/article/details/80118302
今天讲下如何定时执行后台任务。 当然还是那句话,方法有好几种,这里就讲下我认为最好用的。 主要使用到TimerTask和Service,相信大家都接触过,大家可以看下TimerTask的源码。这里是一个简单的TimerTaskDemo。
通过java的TimerTask与Timer设计时间监控,写了一个测试类,帮助新人学习。
博客附属代码http://blog.csdn.net/nacl025/article/details/46892481
用Handler和Timertask实现一个简单的定时器,一个简单的demo
它是用来执行任务的类,接收一个TimerTask实例作为参数。通常,Timer类有两种执行任务的模式。最常用的是schedule模式,它可以通过两种方式执行任务:在某个特定时刻开始执行任务;从当前时刻开始,在某个固定时段...
Timer与TimerTask(计时器)
本文档主要讲述的是Java中的Timer和TimerTask的使用;Timer是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,而且是一个抽象类。希望本文档会给有需要...
利用jdk中的timer和timertask来实现,每天定时执行的任务。 简单的一个demo,可以下载参考学习一下。
spring 定时器 内含TimerTask实现和Quartz实现两种方式
在控件上动态显示内容,这里使用的是TextView,其他控件可以使用相同的方法。