运行时修改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异常。

注意:jdk没有提供setPeriod方法可能是出于线程安全的考虑,
如果你要使用以上的方法在运行时动态修改任务的执行频率,

你要自己保证代码的线程安全。
建议在简单的并且运行时间较短的任务中使用。

时间: 2024-10-10 15:48:12

运行时修改TimerTask的执行周期的相关文章

android apk 防止反编译技术第二篇-运行时修改字节码

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

android apk 防止反编译技术第二篇-运行时修改Dalvik指令

上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止apk反编译的技术-运行时修改字节码.这种方法是在工作中在实现app wrapping时,看到国外的一篇关于android 安全的介绍实现的并且独创.下面我们来介绍一下这种方法. 我们知道apk生成后所有的java生成的class文件都被dx命令整合成了一个classes.dex文件,当apk运行时d

Android逆向之旅---运行时修改内存中的Dalvik指令来改变代码逻辑

一.前言 最近在弄脱壳的时候发现有些加固平台的加固方式是修改了dex文件结构,然后在加载dex到内存的时候,在进行dex格式修复,从而达到了apk保护的效果,那么在dex加载到内存的时候,如何进行dex格式的修复呢?其实原理就是基于运行时修改内存中的Dalvik数据,本文就来用一个简单的例子来介绍一下如何在内存中去修改Dalvik指令代码来改变代码本生的运行逻辑.在讲解本文之前,一定要先看这篇文章:Android中Dex文件格式详解 这篇文章主要介绍了关于Dex文件的格式介绍,这个对于后面修改内

springboot运行时修改端口并且以守护进程运行

springboot项目可以生成war和jar文件来运行,生成war只要在tomcat中修改解压后的配置文件中的端口号就可以.jar需要运行时指定端口,java -jar xxxx.jar server.port=90,这样就可以了, 在守护进程下运行可以使用 nohup java -jar xxx.jar --serverport=89 >info.log &,这样程序就可以在守护进程下运行了. 原文地址:https://www.cnblogs.com/wolf-zt/p/10172474

在Linux下程序运行时修改变量的值

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void bug() 5 { 6      system("reboot"); 7      exit(0); 8 } 9 int stack_test(int a,int b) 10 { 11         //int *p=&a; 12         // p--; 13         // *p=bug; 14         printf(&quo

实现一个支持运行时并发修改配置生效的Configuration类

可配置性是一个好的应用程序的重要指标.我们常常需要实现类似能够运行时修改配置的功能.最近在开发一个中间层的服务程序,最终发布的方式是把代码打成jar包交给调用方使用.这个中间层服务需要一些配置信息,考虑了一下有几个基本的需求: 1. 在ja包中提供一个service-defalut.properties配置文件来提供全部的默认配置.这样的好处是尽量减少对调用方的侵入.调用方可以不提供额外的配置. 2. 调用方也可以提供一个service-site.properties配置文件来提供自定义的配置信

JVM系列之四:运行时数据区

1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存如下图所示. 1-3为线程私有,4-5为线程共享 1.程序计数器:为了线程切换后能恢复到正确的执行位置.线程私有2.Java虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:方法被调用时创建栈帧-->局部变量表->局部变量.对象

AndroidART运行时无缝替换Dalvik虚拟机的过程分析(转载)

AndroidART运行时无缝替换Dalvik虚拟机的过程分析 Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题.老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机的.毕竟在原来的系统中,大量的代码都是运行在Dalvik虚拟机里面的.开始觉得这个替换工作是挺复杂的,但是分析了相关代码之后,发现思路是很清晰的.本文就详细分析这个无缝的替换过程. 老罗的新浪微博:http://we

操作可能会破坏运行时稳定性的解决办法

如果你用了ANTS Performance Profiler的话,并且选择了“Line-Level”就有可能出现下面问题了: System.Security.VerificationException: 操作可能会破坏运行时稳定性. 老外的解决方法:http://stackoverflow.com/questions/378895/operation-could-destabilize-the-runtimeThis happens regularily to me when using ANT