Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测变量是否有';没有在XX秒内修改_Java_Variables_Timer - Fatal编程技术网

Java 检测变量是否有';没有在XX秒内修改

Java 检测变量是否有';没有在XX秒内修改,java,variables,timer,Java,Variables,Timer,嗨,我一直在研究Java是否可以检测变量是否被修改的方法,这可能吗?我想使用一个定时器,这样当变量被修改时,它将重置回零并再次启动。如果变量未修改20秒(即计时器达到20秒),它将执行类似打印变量的操作 Modified指的是任何新的值赋值,例如array[2]=3显然没有内置内容,您不希望在Java中的每个变量旁边隐式存储一些时间戳。您可以做的是将变量包装到某个对象中,封装修改,并在每次发生变异时启动计时器 public class ListeningRef<T> { p

嗨,我一直在研究Java是否可以检测变量是否被修改的方法,这可能吗?我想使用一个定时器,这样当变量被修改时,它将重置回零并再次启动。如果变量未修改20秒(即计时器达到20秒),它将执行类似打印变量的操作


Modified指的是任何新的值赋值,例如
array[2]=3

显然没有内置内容,您不希望在Java中的每个变量旁边隐式存储一些时间戳。您可以做的是将变量包装到某个对象中,封装修改,并在每次发生变异时启动计时器

public class ListeningRef<T> {

    private final ScheduledExecutorService timersPool;

    private T value;
    private ScheduledFuture<?> timer;

    public ListeningRef(ScheduledExecutorService timersPool, T value) {
        this.timersPool = timersPool;
        this.value = value;
    }

    public T get() {
        return value;
    }

    public void set(final T value) {
        this.value = value;
        scheduleTimer();
    }

    private void scheduleTimer() {
        if (timer != null) {
            timer.cancel(true);
        }
        timer = timersPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("Not modified in 20 seconds: " + ListeningRef.this.value);
            }
        }, 20, TimeUnit.SECONDS);
    }
}
公共类ListingRef{
专用最终计划执行器服务时间池;
私人T值;
专用调度未来计时器;
public ListeningRef(ScheduledExecutorService timersPool,T值){
this.timersPool=timersPool;
这个值=值;
}
公共部门得不到{
返回值;
}
公共无效集(最终T值){
这个值=值;
scheduleTimer();
}
私有void scheduleTimer(){
如果(计时器!=null){
timer.cancel(真);
}
timer=timersPool.schedule(新的Runnable(){
@凌驾
公开募捐{
System.out.println(“20秒内未修改:“+listingref.this.value”);
}
},20,时间单位为秒);
}
}
这是您使用它的方式:

final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
final ListeningRef<String> listeningRef = new ListeningRef<String>(pool, "Hi!");
TimeUnit.SECONDS.sleep(19);
System.out.println(listeningRef.get());
listeningRef.set("Bye!");
TimeUnit.SECONDS.sleep(21);
final ScheduledExecutorService pool=Executors.newScheduledThreadPool(10);
final ListeningRef ListeningRef=新建ListeningRef(池“嗨!”);
时间单位。秒。睡眠(19);
System.out.println(listingref.get());
ListingRef.set(“再见!”);
时间单位。秒。睡眠(21);

显然,Java中没有内置任何东西,您不希望在每个变量旁边隐式存储一些时间戳。您可以做的是将变量包装到某个对象中,封装修改,并在每次发生变异时启动计时器

public class ListeningRef<T> {

    private final ScheduledExecutorService timersPool;

    private T value;
    private ScheduledFuture<?> timer;

    public ListeningRef(ScheduledExecutorService timersPool, T value) {
        this.timersPool = timersPool;
        this.value = value;
    }

    public T get() {
        return value;
    }

    public void set(final T value) {
        this.value = value;
        scheduleTimer();
    }

    private void scheduleTimer() {
        if (timer != null) {
            timer.cancel(true);
        }
        timer = timersPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("Not modified in 20 seconds: " + ListeningRef.this.value);
            }
        }, 20, TimeUnit.SECONDS);
    }
}
公共类ListingRef{
专用最终计划执行器服务时间池;
私人T值;
专用调度未来计时器;
public ListeningRef(ScheduledExecutorService timersPool,T值){
this.timersPool=timersPool;
这个值=值;
}
公共部门得不到{
返回值;
}
公共无效集(最终T值){
这个值=值;
scheduleTimer();
}
私有void scheduleTimer(){
如果(计时器!=null){
timer.cancel(真);
}
timer=timersPool.schedule(新的Runnable(){
@凌驾
公开募捐{
System.out.println(“20秒内未修改:“+listingref.this.value”);
}
},20,时间单位为秒);
}
}
这是您使用它的方式:

final ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);
final ListeningRef<String> listeningRef = new ListeningRef<String>(pool, "Hi!");
TimeUnit.SECONDS.sleep(19);
System.out.println(listeningRef.get());
listeningRef.set("Bye!");
TimeUnit.SECONDS.sleep(21);
final ScheduledExecutorService pool=Executors.newScheduledThreadPool(10);
final ListeningRef ListeningRef=新建ListeningRef(池“嗨!”);
时间单位。秒。睡眠(19);
System.out.println(listingref.get());
ListingRef.set(“再见!”);
时间单位。秒。睡眠(21);

首先,您需要将字段包装在get和set方法中,并将其设置为私有。然后,您需要创建一个时间戳,该时间戳随着每次
set
调用而更新:

public void setArray(int index, int value) {
    array[index] = value;
    lastModifiedTime = System.currentTimeMillis();
}

然后,您需要在单独的线程中监视
lastModifiedTime
,并在
System.currentTimeMillis()-lastModifiedTime>20000
时触发事件。首先,您需要将字段包装在get和set方法中,并将其设置为私有。然后,您需要创建一个时间戳,该时间戳随着每次
set
调用而更新:

public void setArray(int index, int value) {
    array[index] = value;
    lastModifiedTime = System.currentTimeMillis();
}

然后需要在单独的线程中监视
lastModifiedTime
,如果
System.currentTimeMillis()-lastModifiedTime>20000
,需要包装属性以创建定时重置,则需要触发事件。您可以基于。您需要包装属性以创建定时重置。您可以将实现基于。

这是可行的,假设OP关心的是被修改的
数组,而不是特定的索引。但这是正确的想法+1.假设OP关心被修改的
数组
,而不是一个特定的索引,那么这是可行的。但这是正确的想法+1.