Java 19 Virtual Thread — คุณควรใช้ไหม

Feb 16 2023
บล็อกนี้เป็นส่วนที่ 1 ของซีรีส์ 2 ส่วน ซึ่งอธิบายว่าเธรดเสมือนใน Java 19 คืออะไร เธรดเสมือนสามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันได้อย่างไร และสุดท้าย การเปรียบเทียบโดยใช้เธรดเสมือน เธรดเสมือนคืออะไร : เนื่องจาก ChatGPT เป็น Google ใหม่ ลองถามเกี่ยวกับคำจำกัดความของ "เธรดเสมือนใน Java19" (ให้คำจำกัดความที่แตกต่างกันและมีความหมายทุกครั้ง ขอชื่นชมผู้สร้างความงามนี้ !!!) เธรดเสมือนคือ ประเภทของเธรดที่มีน้ำหนักเบาใน Java 19

บล็อกนี้เป็นส่วนที่ 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 ของเขา