Java Academy · Pelajaran

Thread Platform berbanding Thread Maya

Bila setiap satunya sesuai digunakan

Pelajaran 3 daripada 413 langkah

Thread Platform berbanding Thread Maya ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.

Dua Jenis Benang

Java kini mempunyai dua jenis benang. Benang platform ialah pembalut klasik di sekeliling benang OS. Benang maya pula ringan dan diurus oleh JVM.

Mengetahui masa untuk memilih setiap jenis ialah asas penulisan Java serentak yang boleh diskalakan.

Mencipta Benang Platform

Anda mencipta benang platform dengan Thread.ofPlatform(), iaitu padanan kepada 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 Kos

Benang platform menggunakan banyak sumber:

  • Kira-kira 1 MB ruang tindanan diperuntukkan bagi setiap benang
  • Lambat dicipta
  • Terhad kepada beberapa ribu sahaja

Benang maya pula murah: tindanan awal yang kecil, penciptaan pantas dan jutaan benang boleh digunakan.

Kerja Terikat Masukan/Keluaran

Jika tugas anda menghabiskan sebahagian besar masanya untuk menunggu rangkaian, cakera atau pangkalan data, benang maya memberikan kelebihan besar.

Apabila satu benang maya disekat, benang pembawanya dibebaskan untuk menjalankan benang lain. Oleh itu, beberapa benang OS boleh melayani ribuan permintaan.

Kerja Terikat CPU

Untuk pengiraan tulen yang tidak pernah disekat, benang maya tidak memberikan peningkatan kelajuan. Anda dihadkan oleh bilangan teras.

Dalam keadaan ini, kumpulan tetap yang saiznya mengikut bilangan pemproses ialah alat yang sesuai.

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 Sekatan

Coretan ini menunjukkan banyak benang maya tidur serentak, sebagai pengganti operasi masukan/keluaran yang disekat. Cuba bayangkan 10,000 benang platform melakukan perkara 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 Benang Latar

Benang maya sentiasa merupakan benang latar dan tidak boleh dijadikan benang bukan latar. Secara lalai, benang platform mewarisi status latar penciptanya, tetapi status itu boleh ditetapkan secara jelas.

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());
    }
}

Keutamaan Diabaikan

Benang maya sentiasa melaporkan keutamaan NORM_PRIORITY, dan penetapan keutamaan tidak memberi kesan. Penjadualan dikendalikan oleh JVM, bukan penjadual 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());
    }
}

Panduan Membuat Keputusan

Panduan praktikal:

  • Banyak tugas yang menunggu operasi masukan/keluaran? Gunakan benang maya.
  • Pengiraan berat yang dihadkan oleh CPU? Gunakan kumpulan tetap benang platform.
  • Perlu melaraskan benang pada peringkat OS, seperti keutamaan atau pertalian? Gunakan benang platform.

Kedua-duanya Wujud Bersama

Anda tidak perlu memilih satu jenis untuk keseluruhan program. Aplikasi biasa menggunakan benang maya untuk pengendalian permintaan dan kumpulan kecil benang platform untuk bahagian yang memerlukan banyak pengiraan.

Kedua-duanya berkongsi antara muka Thread yang sama, jadi pencampuran kedua-duanya berjalan lancar.

Petua Pemindahan

Apabila memindahkan perkhidmatan yang banyak menggunakan operasi masukan/keluaran, perubahan paling kecil ialah menukar pelaksana: gantikan kumpulan tetap atau kumpulan yang menggunakan semula benang dengan newVirtualThreadPerTaskExecutor().

Berhati-hati terhadap pengikatan dan penyalahgunaan ThreadLocal, yang akan diterangkan dalam pelajaran seterusnya.

Semakan Pantas

Pilih beban kerja yang memberikan manfaat paling jelas daripada penggunaan benang maya.

Ringkasan

Anda telah membandingkan dua model benang:

  • Benang platform: berat, disokong OS, terbaik untuk kerja terikat CPU dan pelarasan OS
  • Benang maya: murah, diurus JVM, sentiasa menjadi benang latar, terbaik untuk keserentakan terikat masukan/keluaran
  • Kedua-duanya wujud bersama dan berkongsi antara muka yang sama

Seterusnya: perangkap pengikatan dan ThreadLocals.

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 “Thread Platform berbanding Thread Maya” percuma?

Ya — teks penuh “Thread Platform berbanding Thread Maya” 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 “Thread Platform berbanding Thread Maya”?

Bila setiap satunya sesuai digunakan 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 3 daripada 4.

Berapa lamakah pelajaran “Thread Platform berbanding Thread Maya” 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. Apakah Thread Maya
  2. Mencipta Thread Maya
  3. Thread Platform berbanding Thread Maya
  4. Perangkap: Pinning dan ThreadLocals
← Kembali ke Java Academy