运行时修改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方法可能是出于线程安全的考虑,
如果你要使用以上的方法在运行时动态修改任务的执行频率,
你要自己保证代码的线程安全。
建议在简单的并且运行时间较短的任务中使用。
分享到:
相关推荐
在Java编程中,有时我们需要执行一些任务,但不希望立即执行,而是希望在特定的时间点或者按照特定的周期执行,这时就可以利用`Timer`和`TimerTask`来实现。 `Timer`类是Java中的一个调度器,它允许我们安排在后台...
在Java编程语言中,"自定义任务执行时间"是一个关键概念,它涉及到如何根据特定需求安排任务在未来的某个时刻或周期性地运行。这通常通过使用定时器(Timer)类和相关的API来实现。让我们深入了解一下Java中的定时...
因为TimerTask在后台线程中执行,不能直接修改UI,所以我们需要通过Handler将消息传递到主线程进行处理。以下是一个简单的示例: ```java public class TimerTaskActivity extends Activity { private Timer ...
它们允许开发者在指定的时间间隔内执行特定的操作,这对于实现定时任务,如定时备份、轮询服务或者执行周期性更新等场景非常有用。 一、`Timer` 类的使用 1. 创建 `Timer` 对象:首先,我们需要创建一个 `Timer` ...
你需要将这些类复制到你的Java项目中,根据需求修改包路径,并运行它们以测试倒计时功能。 请注意,虽然`Timer`和`TimerTask`对于简单的定时任务非常有用,但在多线程环境中,特别是需要高精度定时或者大量并发定时...
用户可以通过设定延迟或周期来安排任务的执行,这在创建定时提醒或闹钟功能时非常实用。 例如,以下是一个简单的Java闹钟实现: ```java import java.util.Timer; import java.util.TimerTask; public class ...
如果要周期性执行,可以使用`schedule(TimerTask task, long initialDelay, long period)`,这个方法会让任务在`initialDelay`后首次执行,然后每隔`period`毫秒重复执行。 2. **线程安全:** `java.util.Timer`...
这里的`0`参数表示延迟0毫秒后开始,`1000`参数表示周期性执行的间隔。 3. **取消定时器**:如果需要停止定时器,可以调用`Timer`的`cancel()`方法。这将取消所有已计划但尚未运行的任务,并使`Timer`线程终止。...
在Java编程中,动态设置定时任务是一项非常实用的技术,它允许程序在运行时根据需要创建、修改或取消任务调度,而无需重启服务。这在处理周期性任务、数据同步、监控或其他时间敏感的操作时尤为关键。Java提供了多种...
若要周期性执行任务,可以使用`scheduleAtFixedRate()`方法,它会保证每次执行之间的间隔时间固定: ```java timer.scheduleAtFixedRate(new MyTask(), initialDelay, period); ``` 4. **取消与清理**: 当...
例如,在`onPause()`或`onStop()`中取消定时器,防止当应用退到后台时还在继续执行,浪费系统资源。 ```java @Override protected void onPause() { super.onPause(); if (timer != null) { timer.cancel(); // ...
此外,还有可调时器,允许在运行时动态修改定时间隔。 在不同的编程语言和框架中,定时器的实现方式各异。例如,在Java中,可以使用`java.util.Timer`类和`TimerTask`接口来创建定时任务;在JavaScript中,可以利用...
在Android中,更推荐使用`Handler`或者`Handler.postDelayed()`,或者使用`AlarmManager`来实现周期性任务,因为它们可以在正确的线程中执行。 5. **Android的异步更新UI方式**: - **AsyncTask**:Android提供了`...
这个API包含`java.util.Timer`类和`java.util.TimerTask`类,它们协同工作来实现定时执行的任务。使用Java定时器,你可以创建一次性或周期性的任务,这对于执行定时任务如数据同步、清理缓存或者定期检查更新等场景...
当`MyTimerTask01`运行时,它会调度`MyTimerTask02`,后者在2秒后执行,然后每4秒执行一次。这样就形成了两个交替执行的任务。 `Timer`的核心实现依赖于两个内部类:`TaskQueue`和`TimerThread`。`TaskQueue`是一个...
在Android中,我们可以通过创建一个`Timer`实例并调用`schedule()`方法来安排一个`TimerTask`在未来某个时间点执行。`TimerTask`是一个抽象类,你需要继承它并重写`run()`方法,里面包含倒计时的具体逻辑。例如,...
在多个线程同时修改`Timer`任务时可能会出现不可预知的行为。在Java 5及以后的版本,推荐使用`java.util.concurrent`包中的`ScheduledExecutorService`,它提供了更强大、更灵活且线程安全的定时任务管理功能。 总...
通过调用线程的 `interrupt()` 方法可以提前终止 `Thread.sleep()` 的执行,从而使得线程提前从阻塞状态回到可运行状态。 #### 使用场景 - **线程调度**: 当一个线程需要在一段时间后执行某项任务时,可以通过 `...
3. **并发问题**:当多个 `TimerTask` 在同一时刻触发时,它们会按顺序执行,这可能导致某些任务的执行延迟。如果需要并行执行任务,可能需要寻找其他的调度解决方案,如使用 `ScheduledExecutorService`。 4. **...
在这个例子中,`TimerTask`运行在一个单独的线程,但它在内部调用了`RunOnUiThread()`来确保UI的更新在主线程进行。`schedule()`方法设置了任务的初始延迟和周期,使得每隔1秒,UI就会显示一个新的随机数。 了解了...