import java.util.Timer;
import java.util.TimerTask;
import java.util.function.IntConsumer;
public class Main {
private static class CountDownTimer extends Timer {
private IntConsumer onCountDown;
private Runnable onCountZero;
public CountDownTimer(IntConsumer onCountDown, Runnable onCountZero) {
this.onCountDown = onCountDown;
this.onCountZero = onCountZero;
}
public TimerTask countDown(int count, long period) {
Task task = new Task(count);
scheduleAtFixedRate(task, 0L, period);
return task;
}
private class Task extends TimerTask {
private int count;
public Task(int count) {
this.count = count;
}
@Override
public void run() {
onCountDown.accept(count);
if (--count < 0) {
Task.this.cancel();
onCountZero.run();
}
}
}
}
public static void main(String[] args) throws Exception {
// カウントダウン時の処理 (count: int)
IntConsumer onCountDown = count -> {
System.out.println(count);
};
// カウントゼロ時の処理
Runnable onCountZero = () -> {
System.out.println("Game Over");
};
// Timer を開始する
CountDownTimer timer = new CountDownTimer(onCountDown, onCountZero);
// カウントの初期値とカウントダウン間隔 (ミリ秒)
int count = 10;
long period = 1000L;
// カウントダウン開始 (所要時間 10 秒)
TimerTask task = timer.countDown(count, period);
// 開始後 5 秒間待機
Thread.sleep(5000L);
// カウントダウンを途中で止めてみる
task.cancel();
// その後 5 秒間待機
Thread.sleep(5000L);
// カウントダウン開始 (所要時間 10 秒)
timer.countDown(count, period);
// 開始後 12 秒間待機
Thread.sleep(12000L);
// プログラム終了時に必要な処理
timer.cancel();
}
}
CgppbXBvcnQgamF2YS51dGlsLlRpbWVyOwppbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRDb25zdW1lcjsKCgpwdWJsaWMgY2xhc3MgTWFpbiB7CgoKCXByaXZhdGUgc3RhdGljIGNsYXNzIENvdW50RG93blRpbWVyIGV4dGVuZHMgVGltZXIgewoKCQlwcml2YXRlIEludENvbnN1bWVyIG9uQ291bnREb3duOwoJCXByaXZhdGUgUnVubmFibGUgb25Db3VudFplcm87CgoJCXB1YmxpYyBDb3VudERvd25UaW1lcihJbnRDb25zdW1lciBvbkNvdW50RG93biwgUnVubmFibGUgb25Db3VudFplcm8pIHsKCgkJCXRoaXMub25Db3VudERvd24gPSBvbkNvdW50RG93bjsKCQkJdGhpcy5vbkNvdW50WmVybyA9IG9uQ291bnRaZXJvOwoJCX0KCgkJcHVibGljIFRpbWVyVGFzayBjb3VudERvd24oaW50IGNvdW50LCBsb25nIHBlcmlvZCkgewoKCQkJVGFzayB0YXNrID0gbmV3IFRhc2soY291bnQpOwoJCQlzY2hlZHVsZUF0Rml4ZWRSYXRlKHRhc2ssIDBMLCBwZXJpb2QpOwoKCQkJcmV0dXJuIHRhc2s7CgkJfQoKCQlwcml2YXRlIGNsYXNzIFRhc2sgZXh0ZW5kcyBUaW1lclRhc2sgewoKCQkJcHJpdmF0ZSBpbnQgY291bnQ7CgoJCQlwdWJsaWMgVGFzayhpbnQgY291bnQpIHsKCQkJCXRoaXMuY291bnQgPSBjb3VudDsKCQkJfQoKCQkJQE92ZXJyaWRlCgkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCgkJCQlvbkNvdW50RG93bi5hY2NlcHQoY291bnQpOwoKCQkJCWlmICgtLWNvdW50IDwgMCkgewoJCQkJCVRhc2sudGhpcy5jYW5jZWwoKTsKCQkJCQlvbkNvdW50WmVyby5ydW4oKTsKCQkJCX0KCQkJfQoJCX0KCX0KCgoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CgoJCS8vIOOCq+OCpuODs+ODiOODgOOCpuODs+aZguOBruWHpueQhiAoY291bnQ6IGludCkKCQlJbnRDb25zdW1lciBvbkNvdW50RG93biA9IGNvdW50IC0+IHsKCQkJU3lzdGVtLm91dC5wcmludGxuKGNvdW50KTsKCQl9OwoKCQkvLyDjgqvjgqbjg7Pjg4jjgrzjg63mmYLjga7lh6bnkIYKCQlSdW5uYWJsZSBvbkNvdW50WmVybyA9ICgpIC0+IHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJHYW1lIE92ZXIiKTsKCQl9OwoKCQkvLyBUaW1lciDjgpLplovlp4vjgZnjgosKCQlDb3VudERvd25UaW1lciB0aW1lciA9IG5ldyBDb3VudERvd25UaW1lcihvbkNvdW50RG93biwgb25Db3VudFplcm8pOwoKCQkvLyDjgqvjgqbjg7Pjg4jjga7liJ3mnJ/lgKTjgajjgqvjgqbjg7Pjg4jjg4Djgqbjg7PplpPpmpQgKOODn+ODquenkikKCQlpbnQgIGNvdW50ICA9IDEwOwoJCWxvbmcgcGVyaW9kID0gMTAwMEw7CgoJCS8vIOOCq+OCpuODs+ODiOODgOOCpuODs+mWi+WniyAo5omA6KaB5pmC6ZaTIDEwIOenkikKCQlUaW1lclRhc2sgdGFzayA9IHRpbWVyLmNvdW50RG93bihjb3VudCwgcGVyaW9kKTsKCgkJLy8g6ZaL5aeL5b6MIDUg56eS6ZaT5b6F5qmfCgkJVGhyZWFkLnNsZWVwKDUwMDBMKTsKCgkJLy8g44Kr44Km44Oz44OI44OA44Km44Oz44KS6YCU5Lit44Gn5q2i44KB44Gm44G/44KLCgkJdGFzay5jYW5jZWwoKTsKCgkJLy8g44Gd44Gu5b6MIDUg56eS6ZaT5b6F5qmfCgkJVGhyZWFkLnNsZWVwKDUwMDBMKTsKCgkJLy8g44Kr44Km44Oz44OI44OA44Km44Oz6ZaL5aeLICjmiYDopoHmmYLplpMgMTAg56eSKQoJCXRpbWVyLmNvdW50RG93bihjb3VudCwgcGVyaW9kKTsKCgkJLy8g6ZaL5aeL5b6MIDEyIOenkumWk+W+heapnwoJCVRocmVhZC5zbGVlcCgxMjAwMEwpOwoKCQkvLyDjg5fjg63jgrDjg6njg6DntYLkuobmmYLjgavlv4XopoHjgarlh6bnkIYKCQl0aW1lci5jYW5jZWwoKTsKCX0KfQo=