import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class JadwalTugas {
    public static void main(String[] args) throws Exception {
        ScheduledExecutorService penjadwal = Executors.newScheduledThreadPool(1);
        try {
            // Tiga tugas sekali jalan dengan jeda awal berbeda.
            // Urutan waktu jadwal: malam (100 ms) -> siang (200 ms) -> pagi (300 ms).
            ScheduledFuture<String> pagi =
                    penjadwal.schedule(() -> "alarm pagi", 300, TimeUnit.MILLISECONDS);
            ScheduledFuture<String> siang =
                    penjadwal.schedule(() -> "alarm siang", 200, TimeUnit.MILLISECONDS);
            ScheduledFuture<String> malam =
                    penjadwal.schedule(() -> "alarm malam", 100, TimeUnit.MILLISECONDS);

            // get() menunggu jadwal masing-masing tiba; hasil dicetak sesuai
            // urutan variabel, bukan urutan waktu jadwal -- tetap deterministik.
            System.out.println("jadwal ke-1 (jeda 300 ms): " + pagi.get());
            System.out.println("jadwal ke-2 (jeda 200 ms): " + siang.get());
            System.out.println("jadwal ke-3 (jeda 100 ms): " + malam.get());
            System.out.println("semua alarm sudah berbunyi: "
                    + (pagi.isDone() && siang.isDone() && malam.isDone()));
        } finally {
            penjadwal.shutdown();
            if (!penjadwal.awaitTermination(5, TimeUnit.SECONDS)) {
                penjadwal.shutdownNow();
            }
        }
    }
}
