12

シナリオは次のようなものです:

私のアプリケーションでは、1 つのファイルを開き、更新して保存しました。ファイル保存イベントが発生すると、1 つのメソッドが実行されabc()ます。しかし今、保存イベントが発生した後に遅延を追加したいと思います。たとえば、1分です。だから私は追加しましThread.sleep(60000)た。abc()これで、1 分後にメソッドが実行されます。今まではすべて正常に動作しています。

しかし、ユーザーが 1 分間に 3 回ファイルを保存したとすると、メソッドは 1 分ごとに 3 回実行されます。最新のファイル コンテンツで最初の保存が呼び出された後、次の 1 分間に 1 回だけメソッドを実行したい。

そのようなシナリオをどのように処理できますか?

4

2 に答える 2

15

TimerTimerTaskを使用する

Timerin型のメンバー変数を作成するYourClassType

まあ言ってみれば:private Timer timer = new Timer();

メソッドは次のようになります。

public synchronized void abcCaller() {
    this.timer.cancel(); //this will cancel the current task. if there is no active task, nothing happens
    this.timer = new Timer();

    TimerTask action = new TimerTask() {
        public void run() {
            YourClassType.abc(); //as you said in the comments: abc is a static method
        }

    };

    this.timer.schedule(action, 60000); //this starts the task
}
于 2013-09-04T11:46:00.683 に答える
0

Thread.sleep() を使用している場合、静的メソッドで静的グローバル変数をメソッド呼び出しのブロックを示すために使用できるものに変更するだけですか?

public static boolean abcRunning;
public static void abc()
{
    if (YourClass.abcRunning == null || !YourClass.abcRunning)
    {
        YourClass.abcRunning = true;
        Thread.Sleep(60000);
        // TODO Your Stuff
        YourClass.abcRunning = false;
    }
}

これが機能しない理由はありますか?

于 2017-08-05T19:59:00.810 に答える