こんにちは、変数が変更されたかどうかを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);
}
}
これはあなたがそれを使用する方法です:
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);
最初に、フィールドを get および set メソッドでラップし、それを にする必要がありますprivate
。set
次に、呼び出しごとに更新されるタイムスタンプを作成する必要があります。
public void setArray(int index, int value) {
array[index] = value;
lastModifiedTime = System.currentTimeMillis();
}
lastModifiedTime
次に、別のスレッド内で監視し、イベントをトリガーする必要がありSystem.currentTimeMillis() - lastModifiedTime > 20000
ます。
時限リセットを作成するには、プロパティをラップする必要があります。PropertyChangeSupportに基づいて実装できます。