ExecutorService dan Tipe Kumpulan Thread
Buat kumpulan thread tetap, tersimpan, tunggal, dan terjadwal, lalu pahami kapan masing-masing digunakan.
ExecutorService dan Tipe Kumpulan Thread adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 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 Kumpulan Utas?
Membuat Thread baru untuk setiap tugas membutuhkan biaya besar—pembuatan dan penghancuran utas menimbulkan beban tambahan. Kumpulan utas menggunakan kembali sekumpulan utas tetap untuk menjalankan banyak tugas, sehingga mengurangi beban dan mengendalikan penggunaan sumber daya.
import java.util.concurrent.*;
// Bad practice: new thread per task
new Thread(() -> System.out.println("task")).start();
// Better: reuse threads from a pool
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> System.out.println("task from pool"));
pool.shutdown();newFixedThreadPool
Membuat kumpulan dengan tepat N utas. Tugas tambahan akan mengantre hingga sebuah utas tersedia. Cocok jika Anda mengetahui tingkat paralelisme yang diinginkan.
ExecutorService pool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
final int taskId = i;
pool.submit(() -> {
System.out.println("Task " + taskId + " on " + Thread.currentThread().getName());
});
}
pool.shutdown();
pool.awaitTermination(10, TimeUnit.SECONDS);newCachedThreadPool
Membuat utas sesuai kebutuhan dan menggunakan kembali utas yang menganggur. Utas yang menganggur selama 60 detik akan dihentikan. Cocok untuk banyak tugas berumur pendek; berisiko untuk tugas yang berjalan lama atau tidak terbatas karena dapat menghabiskan memori.
ExecutorService cached = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
cached.submit(() -> {
// quick task
double result = Math.sqrt(Math.random());
});
}
cached.shutdown();newSingleThreadExecutor
Kumpulan yang memiliki tepat satu utas. Tugas dijalankan secara berurutan sesuai urutan pengiriman. Cocok untuk membuat akses ke sumber daya bersama berlangsung secara berurutan.
ExecutorService single = Executors.newSingleThreadExecutor();
single.submit(() -> System.out.println("Task 1"));
single.submit(() -> System.out.println("Task 2"));
single.submit(() -> System.out.println("Task 3"));
// Always prints: Task 1, Task 2, Task 3 (sequential)
single.shutdown();newScheduledThreadPool
Mendukung tugas terjadwal dan berulang. Gunakan untuk pemeriksaan berkala, percobaan ulang, dan pemeliharaan latar belakang.
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
// One-shot delay
scheduler.schedule(() -> System.out.println("Delayed!"),
3, TimeUnit.SECONDS);
// Fixed rate (every 2 seconds)
scheduler.scheduleAtFixedRate(
() -> System.out.println("Tick"),
0, 2, TimeUnit.SECONDS);
// Run later: scheduler.shutdown();VirtualThreadExecutor (Java 21+)
Java 21 memperkenalkan utas virtual—ringan dan murah untuk dibuat. Gunakan Executors.newVirtualThreadPerTaskExecutor() untuk beban kerja yang didominasi operasi masukan/keluaran:
// Java 21+
try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 10_000; i++) {
final int id = i;
exec.submit(() -> {
Thread.sleep(100); // blocks without tying up OS thread
System.out.println("vthread " + id);
});
}
} // auto-shutdownMemilih Kumpulan yang Tepat
Panduan:
- Tugas yang terikat CPU: kumpulan tetap dengan N = jumlah inti
CPU - Tugas yang terikat masukan/keluaran: kumpulan tersimpan atau utas virtual
- Tugas berurutan: pelaksana dengan satu utas
- Tugas terjadwal/berulang: kumpulan utas terjadwal
int cores = Runtime.getRuntime().availableProcessors();
ExecutorService cpuPool = Executors.newFixedThreadPool(cores);
System.out.println("Pool size: " + cores);ThreadPoolExecutor Kustom
Untuk kendali yang lebih terperinci, buat ThreadPoolExecutor secara langsung:
ThreadPoolExecutor tpe = new ThreadPoolExecutor(
2, // corePoolSize
10, // maximumPoolSize
60L, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // work queue
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy() // rejection policy
);
tpe.submit(() -> System.out.println("Custom pool task"));
tpe.shutdown();Penghentian secara Terkendali
Selalu hentikan ExecutorService untuk membebaskan utas. shutdown() berhenti menerima tugas baru, tetapi menyelesaikan tugas yang sudah mengantre. shutdownNow() mencoba membatalkan tugas yang sedang berjalan.
ExecutorService pool = Executors.newFixedThreadPool(4);
// ... submit tasks ...
pool.shutdown(); // no new tasks
try {
if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {
pool.shutdownNow(); // force cancel
}
} catch (InterruptedException e) {
pool.shutdownNow();
Thread.currentThread().interrupt();
}ExecutorService sebagai AutoCloseable (Java 19+)
Di Java 19+, ExecutorService mengimplementasikan AutoCloseable. Gunakan try-with-resources untuk penghentian otomatis:
// Java 19+ (preview), Java 21 stable
try (ExecutorService pool = Executors.newFixedThreadPool(4)) {
pool.submit(() -> System.out.println("task"));
} // pool.close() called: waits for tasks then shuts downKebijakan Penolakan
Saat kumpulan berada dalam kondisi penuh (semua utas sibuk dan antrean penuh), kebijakan penolakan menangani kelebihan tugas:
- AbortPolicy (bawaan): melempar
RejectedExecutionException - CallerRunsPolicy: utas pemanggil menjalankan tugas
- DiscardPolicy: membuang tugas secara diam-diam
- DiscardOldestPolicy: membuang tugas tertua dalam antrean
Pemeriksaan Singkat
Anda memiliki tugas yang terikat CPU dan melakukan perhitungan berat. Berapa banyak utas yang seharusnya dimiliki kumpulan utas tetap Anda?
Ringkasan: ExecutorService dan Kumpulan Utas
Inti penting:
- Kumpulan tetap: N utas tetap; tugas tambahan mengantre
- Kumpulan tersimpan: bertambah sesuai kebutuhan; utas yang menganggur berakhir setelah 60 detik
- Satu utas: urutan eksekusi berurutan dijamin
- Kumpulan terjadwal: tugas tertunda dan berulang
- Selalu panggil
shutdown(); gunakanawaitTermination()untuk keluar dengan bersih
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ExecutorService dan Tipe Kumpulan Thread” gratis?
Ya — teks lengkap “ExecutorService dan Tipe Kumpulan Thread” 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 “ExecutorService dan Tipe Kumpulan Thread”?
Buat kumpulan thread tetap, tersimpan, tunggal, dan terjadwal, lalu pahami kapan masing-masing digunakan. 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 1 dari 4.
Berapa lama pelajaran “ExecutorService dan Tipe Kumpulan Thread” 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