การสร้างเธรดเสมือน
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เธรดเสมือนคืออะไร
- การสร้างเธรดเสมือน
- เธรดแพลตฟอร์มเทียบกับเธรดเสมือน
- ข้อควรระวัง: การตรึงและ ThreadLocals