0

嗨,我一直在研究 Java 是否可以检测变量是否已被修改的任何方法,这可能吗?我想使用一个计时器,以便在修改变量时它将重置为零并重新启动。如果变量在 20 秒内未修改(即计时器达到 20 秒),它将执行诸如打印变量之类的操作。

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

4

3 回答 3

2

显然没有内置任何东西,您不想在 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);
    }
}

这是你如何使用它:

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);
于 2012-10-18T17:05:03.250 回答
2

首先,您需要将字段包装在 get 和 set 方法中,并使其private. 然后,您需要制作一个随每次set调用更新的时间戳:

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

然后,您需要lastModifiedTime在单独的线程中进行监视并触发事件 if System.currentTimeMillis() - lastModifiedTime > 20000

于 2012-10-18T17:07:09.210 回答
1

您需要包装属性以创建定时重置。您可以基于PropertyChangeSupport实现。

于 2012-10-18T17:09:40.737 回答