ScheduledExecutorService untuk Tugas Berulang
Jadwalkan tugas dengan laju tetap atau jeda tetap untuk polling dan pekerjaan pemeliharaan latar belakang.
ScheduledExecutorService untuk Tugas Berulang adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Mengapa Menggunakan ScheduledExecutorService?
ScheduledExecutorService memperluas ExecutorService untuk mendukung penjadwalan tugas. Fitur ini menggantikan kelas Timer/TimerTask lama dengan penjadwal berbasis kumpulan utas yang aman terhadap pengecualian.
import java.util.concurrent.*;
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
// One-shot delay
scheduler.schedule(
() -> System.out.println("Runs once after 3 seconds"),
3, TimeUnit.SECONDS
);
// Don't forget to shut down eventually:
// scheduler.shutdown();schedule: Penundaan Satu Kali
schedule(task, delay, unit) menjalankan tugas satu kali setelah penundaan yang ditentukan. Fitur ini dapat digunakan dengan Runnable maupun Callable:
ScheduledExecutorService s = Executors.newScheduledThreadPool(1);
// Runnable:
ScheduledFuture<?> sf1 = s.schedule(
() -> System.out.println("Runnable fired!"), 2, TimeUnit.SECONDS);
// Callable:
ScheduledFuture<Integer> sf2 = s.schedule(
() -> { System.out.println("Callable fired!"); return 42; },
2, TimeUnit.SECONDS);
System.out.println(sf2.get()); // 42 (after 2 seconds)scheduleAtFixedRate
scheduleAtFixedRate(task, initialDelay, period, unit) menjalankan tugas berulang kali pada laju tetap. Jika tugas membutuhkan waktu lebih lama daripada periodenya, eksekusi berikutnya langsung dimulai setelah tugas tersebut selesai (tanpa tumpang tindih).
ScheduledExecutorService s = Executors.newScheduledThreadPool(1);
AtomicInteger count = new AtomicInteger();
ScheduledFuture<?> sf = s.scheduleAtFixedRate(
() -> System.out.println("Tick " + count.incrementAndGet()),
0, // initial delay
1, // period
TimeUnit.SECONDS
);
Thread.sleep(5000);
sf.cancel(false); // stop after 5 ticks
s.shutdown();scheduleWithFixedDelay
scheduleWithFixedDelay(task, initialDelay, delay, unit) menunggu penundaan yang ditentukan SETELAH setiap tugas selesai sebelum memulai tugas berikutnya. Cocok untuk pemeriksaan berkala saat durasi tugas bervariasi.
s.scheduleWithFixedDelay(
() -> {
System.out.println("Polling... " + Instant.now());
// variable-length polling task
},
0, // no initial delay
5, // 5-second gap AFTER each completion
TimeUnit.SECONDS
);
// Next execution = task end + 5 seconds (not task start)Laju Tetap vs Penundaan Tetap
Perbedaan utama:
- scheduleAtFixedRate: mulai berikutnya = mulai terakhir + periode (pengaturan waktu tanpa pergeseran)
- scheduleWithFixedDelay: mulai berikutnya = selesai terakhir + penundaan (jeda antar-eksekusi selalu terjamin)
Gunakan fixedRate untuk detak jantung; gunakan fixedDelay untuk pemeriksaan berkala saat durasi tugas bervariasi.
ScheduledFuture: Pembatalan
schedule/scheduleAtFixedRate/scheduleWithFixedDelay mengembalikan ScheduledFuture. Panggil cancel(false) untuk menghentikan eksekusi berikutnya tanpa menginterupsi eksekusi yang sedang berjalan:
ScheduledFuture<?> sf = scheduler.scheduleAtFixedRate(
() -> System.out.println("Heartbeat"), 0, 1, TimeUnit.SECONDS);
// Cancel after 5 seconds
scheduler.schedule(() -> sf.cancel(false), 5, TimeUnit.SECONDS);Penanganan Pengecualian dalam Tugas Terjadwal
Jika tugas terjadwal melempar pengecualian yang tidak tertangkap, penjadwal menghentikan eksekusi berulang secara diam-diam—tidak ada eksekusi berikutnya. Selalu bungkus tugas dengan try-catch:
scheduler.scheduleAtFixedRate(() -> {
try {
// risky work
if (Math.random() < 0.3) throw new RuntimeException("transient");
System.out.println("Success");
} catch (Exception e) {
System.err.println("Task error: " + e.getMessage());
// task continues to run on next interval
}
}, 0, 2, TimeUnit.SECONDS);Praktik: Penyegaran Tembolok
Gunakan tugas terjadwal untuk menyegarkan tembolok secara berkala:
class PriceCache {
private volatile Map<String, Double> prices = new HashMap<>();
PriceCache(ScheduledExecutorService scheduler) {
scheduler.scheduleAtFixedRate(this::refresh, 0, 30, TimeUnit.SECONDS);
}
private void refresh() {
System.out.println("Refreshing prices...");
// prices = fetchFromDatabase();
}
Double getPrice(String symbol) { return prices.get(symbol); }
}Praktik: Percobaan Ulang dengan Penundaan Bertahap
Terapkan percobaan ulang dengan jeda eksponensial menggunakan tugas terjadwal:
void retryWithBackoff(Runnable task, int maxRetries, ScheduledExecutorService s) {
AtomicInteger attempts = new AtomicInteger(0);
long[] delay = {1}; // seconds
Runnable wrapper = new Runnable() {
public void run() {
try {
task.run();
} catch (Exception e) {
int n = attempts.incrementAndGet();
if (n < maxRetries) {
delay[0] *= 2;
s.schedule(this, delay[0], TimeUnit.SECONDS);
} else System.err.println("Max retries reached");
}
}
};
s.execute(wrapper);
}Pemantauan: getDelay dan getQueue
Periksa status penjadwal:
ScheduledFuture<?> sf = scheduler.schedule(() -> {}, 10, TimeUnit.SECONDS);
System.out.println("Delay remaining: " + sf.getDelay(TimeUnit.SECONDS) + "s");
// ThreadPoolExecutor provides queue inspection:
if (scheduler instanceof ScheduledThreadPoolExecutor ste) {
System.out.println("Queue size: " + ste.getQueue().size());
}Penghentian dan Pengurasan
Saat penghentian, tentukan apakah tugas terjadwal masih harus dijalankan:
ScheduledThreadPoolExecutor ste = (ScheduledThreadPoolExecutor)
Executors.newScheduledThreadPool(2);
// Cancel scheduled tasks on shutdown (default: false = they run)
ste.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
ste.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
ste.shutdown();Pemeriksaan Singkat
Tugas yang dijadwalkan dengan scheduleAtFixedRate(..., 1, TimeUnit.SECONDS) memerlukan waktu 3 detik untuk selesai. Bagaimana penjadwal menanganinya?
Ringkasan: ScheduledExecutorService
Inti pembelajaran:
- schedule() — sekali jalan dengan penundaan
- scheduleAtFixedRate() — pengaturan waktu tanpa penyimpangan (mulai-ke-mulai)
- scheduleWithFixedDelay() — jeda yang terjamin (selesai-ke-mulai)
- Eksepsi yang tidak tertangkap menghentikan tugas berulang secara diam-diam — selalu bungkus dalam penanganan eksepsi
- Batalkan dengan ScheduledFuture.cancel(false)
Belajar Java dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ScheduledExecutorService untuk Tugas Berulang” gratis?
Ya — teks lengkap “ScheduledExecutorService untuk Tugas Berulang” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “ScheduledExecutorService untuk Tugas Berulang”?
Jadwalkan tugas dengan laju tetap atau jeda tetap untuk polling dan pekerjaan pemeliharaan latar belakang. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “ScheduledExecutorService untuk Tugas Berulang” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- ExecutorService dan Tipe Kumpulan Thread
- Mengirimkan Tugas: Runnable vs Callable
- Future dan Penanganan Error
- ScheduledExecutorService untuk Tugas Berulang