0Pricing
Java Academy · บทเรียน

การสร้างเธรดเสมือน

Thread.ofVirtual และตัวประมวลผล

การสร้างเธรดเสมือน เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

วิธีสร้างเธรดเสมือน

Java มีช่องทางเริ่มต้นหลายแบบสำหรับสร้างเธรดเสมือน สองแบบที่สำคัญที่สุดคือ ตัวสร้าง Thread.ofVirtual() และโรงงาน Executors.newVirtualThreadPerTaskExecutor()

บทเรียนนี้จะอธิบายแต่ละแบบ

ตัวสร้าง: start

Thread.ofVirtual() ส่งคืนตัวสร้าง การเรียกใช้ .start(runnable) จะสร้างและเริ่มเธรดทันที

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().start(() ->
            System.out.println("Started directly"));
        t.join();
    }
}

ตัวสร้าง: unstarted

ใช้ .unstarted(runnable) เมื่อคุณต้องการกำหนดค่าให้เธรดก่อน แล้วจึงเริ่มเธรดในภายหลัง

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.ofVirtual().unstarted(() ->
            System.out.println("Started later"));
        System.out.println("Before start, alive? " + t.isAlive());
        t.start();
        t.join();
    }
}

โรงงานที่ใช้ซ้ำได้

ตัวสร้างสามารถสร้าง ThreadFactory ผ่าน .factory() ได้ การเรียกใช้ newThread แต่ละครั้งจะให้เธรดเสมือนใหม่

import java.util.concurrent.ThreadFactory;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        ThreadFactory factory = Thread.ofVirtual().name("job-", 0).factory();
        Thread a = factory.newThread(() ->
            System.out.println(Thread.currentThread().getName()));
        Thread b = factory.newThread(() ->
            System.out.println(Thread.currentThread().getName()));
        a.start(); b.start();
        a.join(); b.join();
    }
}

วิธีการอำนวยความสะดวก

Thread.startVirtualThread(runnable) เป็นรูปแบบย่อสำหรับสร้างและเริ่มเธรดเสมือนที่ไม่มีชื่อภายในการเรียกใช้ครั้งเดียว

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread t = Thread.startVirtualThread(() ->
            System.out.println("One-liner virtual thread"));
        t.join();
    }
}

แนวทางใช้ตัวจัดการงาน

สำหรับโค้ดที่มุ่งจัดการงาน ควรใช้ Executors.newVirtualThreadPerTaskExecutor() ตัวจัดการนี้จะสร้างเธรดเสมือนใหม่สำหรับทุกงานที่ส่งเข้าประมวลผล

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            exec.submit(() -> System.out.println("task one"));
            exec.submit(() -> System.out.println("task two"));
        }
        System.out.println("All tasks submitted and completed");
    }
}

เหตุผลที่ควรใช้ทรัพยากรแบบลองใช้

ตั้งแต่ Java 19 เป็นต้นมา ExecutorService ได้ใช้ AutoCloseable การปิดตัวจัดการนี้ภายในบล็อกสำหรับลองใช้ทรัพยากรจะรอให้งานทั้งหมดที่ส่งเข้าประมวลผลเสร็จสิ้น

วิธีนี้ช่วยให้ปิดการทำงานอย่างเป็นโครงสร้างได้โดยไม่ต้องเรียกใช้ shutdown และ awaitTermination ด้วยตนเอง

การส่งงานจำนวนมาก

ตัวจัดการงานแบบสร้างเธรดต่องานสามารถจัดการงานจำนวนมหาศาลได้อย่างง่ายดาย แต่ละงานจะได้รับเธรดเสมือนของตนเอง

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        AtomicInteger sum = new AtomicInteger();
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 1; i <= 1000; i++) {
                final int n = i;
                exec.submit(() -> sum.addAndGet(n));
            }
        }
        System.out.println("Sum 1..1000 = " + sum.get());
    }
}

การรวบรวมผลลัพธ์ด้วยผลลัพธ์ล่วงหน้า

submit ส่งคืนค่า Future ดังนั้นคุณจึงรวบรวมค่าที่ส่งกลับได้เช่นเดียวกับตัวจัดการงานอื่น ๆ

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            Future<Integer> f = exec.submit(() -> 6 * 7);
            System.out.println("Result: " + f.get());
        }
    }
}

ตัวสร้างกับตัวจัดการงาน

เลือกใช้ตามจุดประสงค์:

  • ตัวสร้าง / startVirtualThread สำหรับเธรดที่ใช้เพียงครั้งเดียวหรือการตั้งชื่อแบบกำหนดเอง
  • newVirtualThreadPerTaskExecutor สำหรับส่งชุดงานเข้าประมวลผลและรวบรวมผลลัพธ์

ทั้งสองแบบสร้างเธรดเสมือนหนึ่งเธรดต่อหนึ่งหน่วยงาน ซึ่งตรงกับสิ่งที่คุณต้องการ

อย่าเก็บตัวจัดการงานเสมือนไว้ใช้ซ้ำ

อย่านำตัวจัดการงานของเธรดเสมือนตัวเดียวกลับมาใช้ซ้ำราวกับเป็นกลุ่มเธรดคงที่สำหรับประมวลผล ตัวจัดการงานเองสามารถนำกลับมาใช้ซ้ำได้ แต่โปรดจำไว้ว่าแต่ละงานจะสร้างเธรดใหม่เอี่ยมขึ้นมา

ประเด็นสำคัญคือ ไม่มีการรวมเธรดเป็นกลุ่ม มีเพียงการส่งงานเข้าประมวลผลที่สะดวกขึ้นเท่านั้น

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เลือกวิธีที่ดีที่สุดในการประมวลผลชุดงานขนาดใหญ่ โดยให้แต่ละงานทำงานบนเธรดเสมือนของตนเอง

สรุป

ตอนนี้คุณทราบวิธีสร้างเธรดเสมือนแล้ว:

  • Thread.ofVirtual().start(...) และ .unstarted(...)
  • คำสั่งบรรทัดเดียว Thread.startVirtualThread(...)
  • .factory() สำหรับสร้าง ThreadFactory ที่ใช้ซ้ำได้
  • Executors.newVirtualThreadPerTaskExecutor() ร่วมกับการลองใช้ทรัพยากร

ถัดไป: การเลือกใช้ระหว่างเธรดแพลตฟอร์มกับเธรดเสมือน

คำถามที่พบบ่อย

บทเรียน “การสร้างเธรดเสมือน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างเธรดเสมือน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างเธรดเสมือน”

Thread.ofVirtual และตัวประมวลผล คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างเธรดเสมือน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เธรดเสมือนคืออะไร
  2. การสร้างเธรดเสมือน
  3. เธรดแพลตฟอร์มเทียบกับเธรดเสมือน
  4. ข้อควรระวัง: การตรึงและ ThreadLocals
← กลับไปที่ Java Academy