もしいくつかの作業を一定時間遅延後に実行したり、一定時間間隔で定期的に実行する必要があれば、ScheduledThreadPoolExecutorを検討することをお勧めします。
ScheduledThreadPoolExecutor次の4つのメソッドを提供します。
- schedule(Runnable command、long delay、TimeUnit unit):作業を一定時間後に一度実行します。
- schedule(Callable
command、long delay、TimeUnit unit):作業を一定時間後に一度実行し、その結果を返します。 - scheduleAtFixedRate(Runnable command、long initialDelay、long period、TimeUnit unit):作業を一定時間間隔で繰り返し実行されます。
- scheduleWithFixedDelay(Runnable command、long initialDelay、long period、TimeUnit unit):作業が完了すると、一定時間後に再実行されます。 scheduleAtFixedRate()と異なる点は、作業終了時に基準ということです。
schedule(Runnable)
schedule()は、一定時間(delay)の後にJobを実行させるメソッドです。
schedule()に渡される引数は、次のとおりです。
- Runnable:戻り値がないRunnableを引数として受け取ります。
- delay:遅延させる時間です。
- TimeUnit:時間単位です。
package concurrent;
import java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledThreadPoolExecutorExample1 {
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
Runnable runnable = () -> System.out.println("Runnable task : " + LocalTime.now());
int delay = 3;
// Jobをスケジューリングします
System.out.println("Scheduled task : " + LocalTime.now() );
executor.schedule(runnable, delay, TimeUnit.SECONDS);
}
}
結果
Scheduled task : 22:58:43.006
Runnable task : 22:58:46.007
schedule(Callable)
schedule()は、一定時間後にJobを実行させるメソッドです。
schedule()に渡される引数は、次のとおりです。
- Callable
:Tを返すCallable 引数で受けます。 - delay:遅延させる時間です。
- TimeUnit:時間単位です。
schedule()はScheduledFuture<T>を返してJobが完了したら、ScheduledFuture.get()に戻り値を得ることができます。
package concurrent;
import java.time.LocalTime;
import java.util.concurrent.*;
public class ScheduledThreadPoolExecutorExample2 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
Callable<String> callable = () -> "Callable task : " + LocalTime.now();
int delay = 3;
// Jobをスケジューリングします
System.out.println("Scheduled task : " + LocalTime.now() );
ScheduledFuture<String> future =
executor.schedule(callable, delay, TimeUnit.SECONDS);
// 結果が返されるまで待機します
String result = future.get();
System.out.println(result);
}
}
結果
Scheduled task : 23:00:00.025
Callable task : 23:00:03.027
scheduleAtFixedRate()
scheduleAtFixedRate()は、作業を一定時間間隔で実行させるメソッドです。
scheduleAtFixedRate()に渡される引数は、次のとおりです。
- Runnable:戻り値がないRunnableを引数として受け取ります。
- initialDelay:Jobが最初に実行される待機する時間です。
- delay:Jobが実行される時間間隔です。
- TimeUnit:時間単位です。
次の例の結果を見ればJobが実行された後、(完了時間とは無関係に)、一定のdelayの後に再度Jobを実行させることを見ることができます。
package concurrent;
import java.time.LocalTime;
import java.util.concurrent.*;
public class ScheduledThreadPoolExecutorExample3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
Runnable runnable = () -> {
System.out.println("++ Repeat task : " + LocalTime.now());
sleepSec(3);
System.out.println("-- Repeat task : " + LocalTime.now());
};
int initialDelay = 2;
int delay = 3;
// Jobをスケジューリングします
System.out.println("Scheduled task : " + LocalTime.now() );
executor.scheduleAtFixedRate(
runnable, initialDelay, delay, TimeUnit.SECONDS);
}
private static void sleepSec(int sec) {
try {
TimeUnit.SECONDS.sleep(sec);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果
Scheduled task : 23:01:48.967
++ Repeat task : 23:01:50.969
-- Repeat task : 23:01:53.969
++ Repeat task : 23:01:53.970
-- Repeat task : 23:01:56.970
++ Repeat task : 23:01:56.971
-- Repeat task : 23:01:59.971
++ Repeat task : 23:01:59.971
-- Repeat task : 23:02:02.972
++ Repeat task : 23:02:02.972
-- Repeat task : 23:02:05.972
++ Repeat task : 23:02:05.973
-- Repeat task : 23:02:08.973
....
scheduleWithFixedDelay()
scheduleAtFixedRate()は、Jobが完了した後、一定時間後に再度Jobを実行させるメソッドです。
scheduleWithFixedDelay()に渡される引数は、次のとおりです。
- Runnable:戻り値がないRunnableを引数として受け取ります。
- initialDelay:Jobが最初に実行される待機する時間です。
- delay:Jobが完了した後、次のJobが実行されるまでの待機時間です。
- TimeUnit:時間単位です。
次の例の結果を見ればJobが終わった後、delayだけ待ってから、次のJobを実行させることを見ることができます。
package concurrent;
import java.time.LocalTime;
import java.util.concurrent.*;
public class ScheduledThreadPoolExecutorExample4 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
Runnable runnable = () -> {
System.out.println("++ Repeat task : " + LocalTime.now());
sleepSec(3);
System.out.println("-- Repeat task : " + LocalTime.now());
};
int initialDelay = 2;
int delay = 3;
// Jobをスケジューリングします
System.out.println("Scheduled task : " + LocalTime.now() );
executor.scheduleWithFixedDelay(
runnable, initialDelay , delay, TimeUnit.SECONDS);
}
private static void sleepSec(int sec) {
try {
TimeUnit.SECONDS.sleep(sec);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
結果
Scheduled task : 23:03:29.282
++ Repeat task : 23:03:31.284
-- Repeat task : 23:03:34.285
++ Repeat task : 23:03:37.285
-- Repeat task : 23:03:40.286
++ Repeat task : 23:03:43.286
-- Repeat task : 23:03:46.286
++ Repeat task : 23:03:49.287
-- Repeat task : 23:03:52.287
++ Repeat task : 23:03:55.288
-- Repeat task : 23:03:58.288
++ Repeat task : 23:04:01.288
-- Repeat task : 23:04:04.289
....
Related Posts
- Java - AtomicReference使用方法
- Java - CountDownLatchを使用する方法、および例
- Java - ScheduledThreadPoolExecutor使用方法
- Java - SummaryStatisticsの使用方法(count、min、max、average)
- Java8 - 関数型インタフェース (Functional Interface) について
- Java - String配列をint配列に変換する
- Java - ArrayList要素の値を変更する方法、replaceAll()
- Java - 2つのリストが同じかどうかを比較
- Java - 配列から特定のIndex要素を削除する3つの方法
- Java - HashMapソート、4つの方法
- Java - 文字列を配列に変換する方法
- Java - ArrayListが空であることを確認する3つの方法
- Java - ArrayListの巡回、4つの方法
- Java - ArrayListの最大値、最小 値を見つける
- Java - ArrayListの合計、平均値の計算
- Java - HashMap巡回、3つの方法
- Java - do whileとwhileの違い
- Java - Lambda式と関数型インタフェース
- Java - List empty(null)チェック、3つの方法
- Java - ArrayListの初期化、4つの方法
- Java - Stream.reduce()の使い方と例
- Java - 2つのマップを結合する(merge、putAll)
- Java - java.util.Dateをjava.sql.Dateに変換する
- Java - ArrayListをStringに変換する
- Java - ClassNotFoundExceptionの発生原因と解決策
- Java - 非静的メソッドは静的コンテキストから参照できません
- Java - NoSuchMethodErrorの原因と解決策
- Java - JSONライブラリを使用する方法(JSONObject、JSONArray)
- Java - byte[]配列をFileに保存
- Java - byte[]の配列をStringに変換
- Java - ファイルのアクセス権を確認し、変更
- Java - 一時フォルダ(Temp directory)パスを取得する
- Javaでシェルスクリプトを実行
- Java - Streamを配列に変換する
- Java - リスト重複排除、2つの方法