Java Academy · Pelajaran

ExecutorService dan Jenis Kumpulan Benang

Cipta kumpulan benang tetap, dicache, tunggal dan berjadual serta fahami masa untuk menggunakan setiap satunya.

Pelajaran 1 daripada 413 langkah

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-shutdown

Memilih 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 down

Dasar 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
Percuma untuk bermula

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

  1. ExecutorService dan Jenis Kumpulan Benang
  2. Menghantar Tugas: Runnable berbanding Callable
  3. Future dan Pengendalian Ralat
  4. ScheduledExecutorService untuk Tugas Berulang
← Kembali ke Java Academy