Java 19 Virtual Thread — คุณควรใช้ไหม
บล็อกนี้เป็นส่วนที่ 1 ของซีรีส์ 2 ส่วน ซึ่งอธิบายว่าเธรดเสมือนคืออะไรในJava 19เธรดเสมือนสามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันได้อย่างไร และสุดท้าย การเปรียบเทียบโดยใช้เธรดเสมือน
เธรดเสมือนคืออะไร :
เนื่องจากChatGPTเป็นGoogleใหม่ ลองถามเกี่ยวกับคำจำกัดความของ "เธรดเสมือนใน Java19" (ทุกครั้งให้คำจำกัดความที่แตกต่างและมีความหมาย ขอชื่นชมผู้สร้างความงามนี้ !!!)
เธรดเสมือนเป็นเธรดน้ำหนักเบาประเภทหนึ่งใน Java 19 เธรดเสมือนอนุญาตให้ผู้ใช้สร้างเธรดจำนวนมาก โดยไม่ต้องเสียค่าใช้จ่ายที่เกี่ยวข้องกับเธรดแบบดั้งเดิม เธรดเสมือนได้รับการจัดการโดย Java Virtual Machine ดังนั้นจึงสามารถใช้ซ้ำได้ตามต้องการและเปิดใช้งานการปรับปรุงประสิทธิภาพอย่างมากเมื่อเปรียบเทียบกับการใช้เธรดเนทีฟแบบดั้งเดิม
คนรักF หรือGoLang กระทู้เสมือนจริงสำหรับกิจวัตรประจำวันไม่มีอะไรนอกจาก'พี่ชายจากแม่อีกคน'
เหตุใดเธรดเสมือนจึงมีประโยชน์
เธรดเสมือนของ Java นั้นแตกต่างจากเธรดของแพลตฟอร์มดั้งเดิมในแง่ที่ว่าเธรดเสมือนนั้นมีน้ำหนักเบากว่ามากในแง่ของจำนวนทรัพยากร (RAM) ที่พวกเขาต้องการจากระบบเพื่อรัน ดังนั้น คุณสามารถมีเธรดเสมือนที่ทำงานอยู่ในแอปพลิเคชันของคุณได้มากกว่าเธรดแพลตฟอร์ม ในขณะที่ให้คุณได้รับประโยชน์อย่างเต็มที่จากเธรดแพลตฟอร์มปกติ
การใช้เธรดเสมือน
การสร้างเธรดเสมือนใน java นั้นคล้ายกับการสร้างเธรดที่รันได้ทั่วไป อย่างไรก็ตาม เราจะใช้คลาส Executors เพื่อสร้างnewVirtualThreadPerTaskExecutor () ซึ่งจะเริ่มต้นเธรดเสมือนใหม่สำหรับแต่ละงาน จำนวนเธรดที่สร้างโดย Executor ไม่จำกัด
ทดสอบ
ในการทดสอบนี้ ฉันจะเรียกใช้บริการภายนอก (ซึ่งใช้เวลา 1 มิลลิวินาทีในการตอบสนอง) และดำเนินการ 1 ล้านครั้งโดยใช้ทั้งแพลตฟอร์มทั่วไปและเธรดเสมือน
เป้าหมาย:
เพื่อเปรียบเทียบเวลาที่ใช้โดยเธรดเสมือนกับเธรดทั่วไปในการดำเนินการให้เสร็จสมบูรณ์ 1 ล้านครั้ง
สเปคเครื่อง : 10 คอร์ หน่วยความจำ 16GB
รหัส :
เธรดธรรมดา
ฉันสามารถใช้เธรดได้สูงสุด 1,000 เธรดอีกต่อไป และฉันได้รับข้อผิดพลาด OOM
เธรดเสมือน
ผลลัพธ์ :
ด้านล่างคือการใช้งาน CPU + เวลาที่ใช้โดยทั้งสองวิธีในการเรียกใช้ภายนอกสำหรับลูป 10 ครั้ง
เธรดธรรมดา
เธรดเสมือนจริง
บทสรุป :
ความแตกต่างของเวลาระหว่างการใช้งานของเธรดธรรมดากับเธรดเสมือนทำให้เรามีผู้ชนะที่ชัดเจนสำหรับการใช้เธรดเสมือนในกรณีที่เรากำลังรอบริการภายนอกบางอย่าง หากเราคาดการณ์ตัวอย่างนี้เป็น 10 ล้านหรือ 100 ล้านสาย ความแตกต่างจะมากขึ้นอย่างเห็นได้ชัด และเธรดเสมือนจะมีประสิทธิภาพที่ดีกว่าเมื่อแอปพลิเคชันเกี่ยวข้องกับการรอแอปพลิเคชันภายนอกบางตัว
ตัวอย่างนี้เลียนแบบการเรียกบริการภายนอกโดยใช้Thread.sleep()ซึ่งสามารถแทนที่ได้ด้วยการเรียกจริงไปยังบริการภายนอก นี่เป็นแบบฝึกหัดสำหรับผู้อ่าน ทำมัน!!!
หมายเหตุ :เป็นความจริงที่ว่าโดยการลองผิดลองถูก เราสามารถเพิ่มประสิทธิภาพให้กับจำนวนการสร้างเธรดแบบเดิมได้ แม้ว่าจะเป็นไปไม่ได้ที่จะคาดการณ์จำนวนเธรดที่สมบูรณ์แบบสำหรับทุกกรณีการใช้งาน (หากคุณสุ่มเก็บพูลที่มีเธรดสูงกว่า คุณกำลังสิ้นเปลืองทรัพยากรแอปพลิเคชันโดยไม่จำเป็น) การใช้การจัดสรรเธรดแบบไดนามิก (เธรดเสมือน) เหมาะสมกว่ามากในแอปพลิเคชันในโลกแห่งความเป็นจริง
ปัญหาเกี่ยวกับการใช้เธรดเสมือน
ตัวอย่างข้างต้นทำให้คุณรู้ว่าเธรดเสมือนเป็นข้อตกลงที่ร้อนแรง และเพื่อเพิ่มความเร็วแอปพลิเคชันของคุณและเพื่อการใช้งาน CPU ของคุณอย่างเหมาะสมที่สุด เราควรสร้างเธรดเสมือนเสมอ
ถ้าทุกอย่างไม่ได้มาพร้อมกับ " BUT "
เธรดเสมือนใน Java นั้นยอดเยี่ยมแต่ในกรณีที่แอปพลิเคชันของคุณไม่มี I/O bound เช่น หากตัว CPU เองจำเป็นต้องทำการประมวลผลอย่างหนัก (เช่น การฝึกโมเดลหรือการนับเป็น 100 ล้าน) การใช้เธรดเสมือนไม่ใช่ตัวเลือกที่เหมาะสมที่สุด
รายละเอียดจะกล่าวถึงในส่วนที่ 2 ของบทความนี้ คอยติดตาม!!!
ความคิดสุดท้าย
การแนะนำระบบ Java 19ยังอยู่ในช่วงการพัฒนา (เนื่องจากโปรเจ็กต์Loomยังอยู่ในช่วงพรีวิวเท่านั้นในตอนนี้) แม้ว่าเราคาดว่าจะเห็นการปรับปรุงอย่างมากในการจัดการเซิร์ฟเวอร์ เวลาตอบสนอง API ที่เร็วขึ้น และปัญหา OOM ที่น้อยลง
เกี่ยวกับผู้เขียน:
Yash Bansal เป็นรองวิศวกรหลักของ RedBus สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับเขาได้ที่โปรไฟล์LinkedIn ของเขา





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)