0

特定のメソッドが特定の遅延の後に呼び出されるようにしたい。タイマー、エグゼキューター、ハンドラーなど、さまざまなアプローチを試しました。彼らはやるべきことを果たしますが、少し例外があります。遅延メソッド呼び出しは、グアバからのマルチマップにいくつかの変更を加えます。TimerTaskの -method 内ではrun、出力は私が望むようなものです。しかし、マルチマップの外側を印刷するとrun、変更は取り消され、古いマルチマップの値が残っています。しかし、データが保存されており、操作するには更新された値が必要なので、更新されたものが必要です。

私のコードは次のようになります。

public class classTimer {
  public static void main(String[] args) {
    //some code, irrelevant for the task

             new Timer().schedule(new TimerTask() {          
             @Override
             public void run() {
                 dataMap = UndoManager.undoChanges(dataMap, a, hw); 
                 // Point 1  
                    }
                }, delay);  
                // Point 2
   }
 }

前に言ったように、dataMapPoint1 で を印刷すると正しい出力が得られ、Point 2 ではメソッドUndoChangesがより新しく呼び出されたように古い値が得られます。変更が一貫性を保つようにマルチマップが実装されており、通常は値が変更されている必要がありますが、ここではそうではありません。ここで何が欠けていますか?遅延後にメソッドを呼び出す別の方法を誰かが知っている場合は、喜んで聞いてください。

ありがとうございました

4

1 に答える 1

5

コードのポイント 2 は、元に戻すタスクをスケジュールした直後に実行されます。これは、scheduleメソッドがすぐに戻るためです。遅延が経過してタスクが実行されるのを待ちません。これがタイマーを使用する真のポイントです。つまり、非同期タスクを将来のある時点で実行するようにスケジュールします。

于 2013-10-27T17:12:21.667 に答える