2017-01-01 9 views
1

私は、X秒ごとにメソッドを実行するScheduled Execution Serviceを持っています。実行遅延の残りの時間をスキップしてメソッドをすぐに呼び出すようにスケジュール実行サービスを強制できるメソッドを持つことは可能ですか?それとも単に停止してすぐに再起動できますか?現在の実行遅延をスキップするか、即時実行サービスを再起動できますか?

は、ここに私のコードです:

ここ
Runnable runnable = new Runnable() { 
    public void run() { 

     callTheFunction(); 

    } 
}; 

ScheduledExecutorService executor; 
executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(Runnable, 0, 5, TimeUnit.SECONDS); // 0 sec delay | 5 sec repeat 

public void restartTheExecutor() { 
    // code to restart it or skip the remaining time. 
} 

で私の更新とコードの作業、それは偽の最初の実行に設定されなければならないパラメータのブール値が含まれています。

public void restartExecutor(View v, boolean stopRequiered) { 

    if (stopRequiered) { 
     scheduled.cancel(true); 
    } 

    Runnable runnable = new Runnable() { 
     public void run() { 
      nextExpression(); 
     } 
    }; 

    ScheduledExecutorService executor; 
    executor = Executors.newScheduledThreadPool(1); 
    scheduled = executor.scheduleAtFixedRate(runnable, 0, 3, TimeUnit.SECONDS); // 0 sec delay | 5 sec repeat 

} 

答えて

2

ScheduledExecutorServiceでスケジュールされた機能をすぐに実行することはできません。

ただし、2番目の質問の回答は「はい」です。スケジュールされた機能はいつでも削除して、実行することができます。 cancel()は、次の(または現在)の実行だけでなく、将来のすべての実行だけでなくキャンセルされますことを、

Runnable runnable = new Runnable() { 
    public void run() { 
     callTheFunction(); 
    } 
}; 

ScheduledExecutorService executor; 
executor = Executors.newScheduledThreadPool(1); 
Future<?> scheduled = executor.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS); // 0 sec delay | 5 sec repeat 

// cancel and run immediately: 
scheduled.cancel(true); 
runnable.run(); 

注:あなたは、別々にかかわらず、関数への参照が必要になります。だから、もう一度再スケジュールする必要があります:

// reassigned scheduled to next runs: 
scheduled = executor.scheduleAtFixedRate(runnable, 5, 5, TimeUnit.SECONDS); // 5 sec delay | 5 sec repeat 

それとも単に再び0遅延や5Sリピートとは非同期に実行することにより、両方のステップを実行します。

scheduled.cancel(true); 
scheduled = executor.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS); // 0 sec delay | 5 sec repeat 
+0

おかげで、 – james

+0

は私がにして実行している完璧に動作しますエラーのビット、私は関数であなたのコードを実行し、それは一度だけ実行し、停止します。 – james

+1

@james:私が書いたように、 'cancel()'は次の実行だけでなく将来のすべての実行をキャンセルするので、再度スケジュールを変更する必要があります。完全な答えを見てください(そして私は別の解決策で更新しました)。 –

関連する問題