2012-10-18 65 views
0

嗨我一直在尋找任何方式,如果Java可以檢測到變量是否已被修改,這可能嗎?我想使用一個計時器,這樣當變量被修改時,它將重置爲零並重新啓動。如果變量未修改爲20秒(即計時器達到20秒),它將執行類似打印變量的操作。檢測變量是否在XX秒內未被修改

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

回答

2

首先你需要用的get和set方法的領域,並使其private。然後,你需要做的是它和每個set調用更新時間戳:

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

然後,您將需要監控一個單獨的線程中lastModifiedTime如果System.currentTimeMillis() - lastModifiedTime > 20000觸發事件。

+0

這可以工作,假設OP關心'array'被修改,而不是一個特定的索引。但這是正確的想法。 +1。 –

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);