0Pricing
Java Academy · Pelajaran

Thread Platform vs Virtual

Kapan masing-masing tepat digunakan.

Thread Platform vs Virtual adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Dua Jenis Utas

Sekarang Java memiliki dua jenis utas. Utas platform adalah pembungkus klasik di sekitar utas OS. Utas virtual ringan dan dikelola JVM.

Mengetahui kapan harus memilih masing-masing jenis merupakan inti dari penulisan Java konkuren yang dapat diskalakan.

Membuat Utas Platform

Anda membuat utas platform dengan Thread.ofPlatform(), yang merupakan padanan dari Thread.ofVirtual().

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread p = Thread.ofPlatform().name("native-worker").start(() ->
            System.out.println("Platform? " + !Thread.currentThread().isVirtual()));
        p.join();
    }
}

Perbandingan Biaya

Utas platform membutuhkan banyak sumber daya:

  • Tumpukan yang dicadangkan sekitar 1 MB per utas
  • Lambat dibuat
  • Terbatas hingga beberapa ribu utas

Utas virtual murah: tumpukan awalnya kecil, pembuatannya cepat, dan jumlah hingga jutaan memungkinkan.

Pekerjaan Terikat I/O

Jika tugas Anda menghabiskan sebagian besar waktunya untuk menunggu jaringan, disk, atau basis data, utas virtual memberikan keuntungan besar.

Saat satu utas virtual terblokir, utas pembawanya dapat menjalankan utas lain, sehingga segelintir utas OS dapat melayani ribuan permintaan.

Pekerjaan Terikat CPU

Untuk perhitungan murni yang tidak pernah terblokir, utas virtual tidak memberikan peningkatan kecepatan. Anda dibatasi oleh jumlah inti prosesor.

Dalam situasi ini, kumpulan tetap yang ukurannya disesuaikan dengan jumlah prosesor merupakan alat yang tepat.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        int cores = Runtime.getRuntime().availableProcessors();
        try (ExecutorService cpu = Executors.newFixedThreadPool(cores)) {
            Future<Long> f = cpu.submit(() -> {
                long s = 0;
                for (long i = 0; i < 1_000_000L; i++) s += i;
                return s;
            });
            System.out.println("Cores: " + cores + ", sum: " + f.get());
        }
    }
}

Mensimulasikan Pemblokiran

Cuplikan ini menunjukkan banyak utas virtual yang tidur secara bersamaan, sebagai pengganti I/O yang memblokir. Coba bayangkan 10.000 utas platform melakukan hal yang sama.

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        AtomicInteger done = new AtomicInteger();
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 10_000; i++) {
                exec.submit(() -> {
                    try { Thread.sleep(50); } catch (InterruptedException e) {}
                    done.incrementAndGet();
                });
            }
        }
        System.out.println("Finished blocking tasks: " + done.get());
    }
}

Status Latar Belakang

Utas virtual selalu merupakan utas latar belakang dan tidak dapat diubah menjadi utas biasa. Secara bawaan, utas platform mewarisi status latar belakang pembuatnya, tetapi status tersebut dapat ditetapkan secara eksplisit.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        Thread p = Thread.ofPlatform().unstarted(() -> {});
        System.out.println("virtual daemon: " + v.isDaemon());
        System.out.println("platform daemon: " + p.isDaemon());
    }
}

Prioritas Diabaikan

Utas virtual selalu melaporkan prioritas NORM_PRIORITY, dan penetapan prioritas tidak berpengaruh. Penjadwalan ditangani oleh JVM, bukan penjadwal OS.

public class Main {
    public static void main(String[] args) {
        Thread v = Thread.ofVirtual().unstarted(() -> {});
        v.setPriority(Thread.MAX_PRIORITY);
        System.out.println("Priority is still: " + v.getPriority());
    }
}

Pedoman Pengambilan Keputusan

Aturan praktisnya:

  • Banyak tugas yang menunggu I/O? Gunakan utas virtual.
  • Perhitungan berat yang dibatasi CPU? Gunakan kumpulan tetap utas platform.
  • Memerlukan penyetelan utas tingkat OS, seperti prioritas atau afinitas? Gunakan utas platform.

Hidup Berdampingan

Anda tidak harus memilih satu jenis untuk seluruh program. Aplikasi yang umum menggunakan utas virtual untuk menangani permintaan dan kumpulan kecil utas platform untuk bagian yang intensif CPU.

Keduanya menggunakan API Thread yang sama, sehingga dapat dicampur dengan mudah.

Kiat Migrasi

Saat memindahkan layanan yang berat pada I/O, perubahan terkecil adalah mengganti eksekutornya: ganti kumpulan tetap atau kumpulan yang tersimpan dalam tembolok dengan newVirtualThreadPerTaskExecutor().

Berhati-hatilah terhadap keterpakuan dan penyalahgunaan ThreadLocal, yang akan dibahas pada pelajaran berikutnya.

Uji Singkat

Pilih beban kerja yang mendapatkan manfaat paling jelas dari utas virtual.

Rangkuman

Anda telah membandingkan dua model utas:

  • Utas platform: berat, didukung OS, paling sesuai untuk pekerjaan terikat CPU dan penyetelan OS
  • Utas virtual: murah, dikelola JVM, selalu merupakan utas latar belakang, paling sesuai untuk konkurensi yang terikat I/O
  • Keduanya dapat hidup berdampingan dan menggunakan API yang sama

Selanjutnya: kendala keterpakuan dan ThreadLocals.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Thread Platform vs Virtual” gratis?

Ya — teks lengkap “Thread Platform vs Virtual” 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 “Thread Platform vs Virtual”?

Kapan masing-masing tepat 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 3 dari 4.

Berapa lama pelajaran “Thread Platform vs Virtual” 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

  1. Apa Itu Virtual Thread
  2. Membuat Virtual Thread
  3. Thread Platform vs Virtual
  4. Jebakan: Pinning dan ThreadLocals
← Kembali ke Java Academy