java定时器在执行期间 我改变了定时器的执行周期时间 那么这个定时器是否按改变的执行周期执行呢 如果不行 那么需要怎么改变
定时器的执行周期呢
[code="java"]resetPeriod(time); [/code]
赋值错了,应该是
[code="java"]resetPeriod(newTime); [/code]
莫怪。
会改变。但是是下个周期开始改变,当前周期还是不会中止调的。
要想立马中止,那只能cancel掉然后重新调度。
真的是可以的,亲。
[code="java"]
public class TimerTaskTest
{
public static Timer timer = new Timer();
private final static long SENCOND = 1000l;
public static void main(String[] args) throws InterruptedException,
IllegalArgumentException, IllegalAccessException
{
Task task = new Task();
timer.schedule(task, 1 * SENCOND, 1 * SENCOND);
Field[] fields = task.getClass().getSuperclass().getDeclaredFields();
for (Field field : fields)
{
if (field.getName().endsWith("period"))
{
if (!field.isAccessible())
{
field.setAccessible(true);
}
field.set(task, 5 * SENCOND);
}
}
}
public static class Task extends TimerTask
{
@Override
public void run()
{
System.out.println("run task");
}
}
}
[/code]
建议设计一张表,专拿来存放执行时间..之类可能存在变化的东西.
这样就不会很被动的每次都需要去改工程,听服务,什么的...
只需要改下数据库就好
[quote]long time=5l;
Task task = new Task();
timer.schedule(new Timertask(){
public void run()
{
time=config.getvalue();//这个时间是动态加载的
}
}, 0, time * 60*1000);
上面这个定时器time是每次都改变的,但是定时器执行周期没变啊? [/quote]
一样的写法:
[code="java"]
final long time = 5l;
Task task = new Task();
timer.schedule(new TimerTask()
{
public void run()
{
long newTime = config.getvalue();// 这个时间是动态加载的
if (time != newTime)
{
resetPeriod(time);
}
}
public void resetPeriod(final long time)
{
Field[] fields = this.getClass().getSuperclass()
.getDeclaredFields();
for (Field field : fields)
{
if (field.getName().endsWith("period"))
{
if (!field.isAccessible())
{
field.setAccessible(true);
}
field.set(this, time * 60 * 1000);
}
}
}
}, 0, time * 60 * 1000);
[/code]