ExecutorService dan Jenis Kumpulan Benang
Cipta kumpulan benang tetap, dicache, tunggal dan berjadual serta fahami masa untuk menggunakan setiap satunya.
ExecutorService dan Jenis Kumpulan Benang ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Mengapa Menggunakan Kumpulan Utas?
Mencipta Thread baharu untuk setiap tugas adalah mahal — penciptaan dan pemusnahan utas mempunyai overhed. Kumpulan utas menggunakan semula set utas yang tetap untuk melaksanakan banyak tugas, sekali gus mengurangkan overhed dan mengawal penggunaan sumber.
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
Mencipta kumpulan dengan tepat N utas. Tugas tambahan beratur sehingga utas tersedia. Sesuai apabila tahap keparalelan yang dikehendaki telah diketahui.
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
Mencipta utas atas permintaan dan menggunakan semula utas yang melahu. Utas yang melahu selama 60 saat akan ditamatkan. Sesuai untuk banyak tugas jangka pendek; berisiko untuk tugas yang berjalan lama atau tidak terhad kerana boleh 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 dengan tepat satu utas. Tugas dilaksanakan secara berturutan mengikut susunan penyerahan. Sesuai untuk mensiri akses kepada sumber yang dikongsi.
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
Menyokong tugas berjadual dan berulang. Gunakannya untuk tinjauan, percubaan semula dan penyelenggaraan 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 maya — ringan dan murah untuk dicipta. Gunakan Executors.newVirtualThreadPerTaskExecutor() untuk beban kerja yang intensif I/O:
// 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 Sesuai
Garis panduan:
- Tugas terikat CPU: Kumpulan tetap dengan N = bilangan teras CPU
- Tugas terikat I/O: Kumpulan cache atau utas maya
- Tugas berjujukan: Pelaksana utas tunggal
- Berjadual/berulang: Kumpulan utas berjadual
int cores = Runtime.getRuntime().availableProcessors();
ExecutorService cpuPool = Executors.newFixedThreadPool(cores);
System.out.println("Pool size: " + cores);ThreadPoolExecutor Tersuai
Untuk kawalan yang lebih terperinci, cipta ThreadPoolExecutor secara terus:
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();Penutupan yang Teratur
Sentiasa tutup ExecutorService untuk membebaskan utas. shutdown() berhenti menerima tugas baharu tetapi menyelesaikan tugas yang beratur. shutdownNow() cuba 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+)
Dalam Java 19+, ExecutorService melaksanakan AutoCloseable. Gunakan sumber cuba-dengan-sumber untuk penutupan automatik:
// 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 downDasar Penolakan
Apabila kumpulan mencapai kapasiti maksimum (semua utas sibuk, baris gilir penuh), dasar penolakan mengendalikan limpahan tersebut:
- AbortPolicy (lalai): melontarkan
RejectedExecutionException - CallerRunsPolicy: utas pemanggil menjalankan tugas
- DiscardPolicy: menggugurkan tugas secara senyap
- DiscardOldestPolicy: menggugurkan tugas paling lama dalam baris gilir
Semakan Pantas
Anda mempunyai tugas terikat CPU yang melakukan pengiraan berat. Berapakah bilangan utas yang patut ada dalam kumpulan utas tetap anda?
Ulang Kaji: ExecutorService dan Kumpulan Utas
Perkara penting:
- Kumpulan tetap: N utas tetap; tugas tambahan beratur
- Kumpulan cache: berkembang atas permintaan; utas melahu tamat selepas 60 saat
- Utas tunggal: susunan pelaksanaan berjujukan dijamin
- Kumpulan berjadual: tugas tertunda dan berulang
- Sentiasa gunakan shutdown(); awaitTermination() untuk keluar dengan bersih
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “ExecutorService dan Jenis Kumpulan Benang” percuma?
Ya — teks penuh “ExecutorService dan Jenis Kumpulan Benang” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “ExecutorService dan Jenis Kumpulan Benang”?
Cipta kumpulan benang tetap, dicache, tunggal dan berjadual serta fahami masa untuk menggunakan setiap satunya. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “ExecutorService dan Jenis Kumpulan Benang” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- ExecutorService dan Jenis Kumpulan Benang
- Menghantar Tugas: Runnable berbanding Callable
- Future dan Pengendalian Ralat
- ScheduledExecutorService untuk Tugas Berulang