วงจรชีวิตของเธรดใน Java
เผยแพร่แล้ว: 2023-01-27สารบัญ
พื้นฐานของเธรด Java:
เธรดใน Java ช่วยอำนวยความสะดวกในการปฏิบัติงานของหลายกิจกรรมภายในกระบวนการเดียว ถือได้ว่าเป็นกระบวนการที่มีน้ำหนักเบา เธรดสามารถกำหนดเป็นลำดับของคำสั่งที่ดำเนินการ ทุกเธรดใน Java มีสแต็ก ตัวนับโปรแกรม และตัวแปรภายในของตัวเอง เธรด Java อาจเป็นชุดของการเรียกใช้เมธอดที่ซ้อนกัน หน่วยความจำ สถานะต่อกระบวนการ และไฟล์ถูกแชร์โดยเธรด
การใช้เธรดใน Java:
- เพื่อดำเนินการพื้นหลังหรือการประมวลผลแบบอะซิงโครนัส
- เพื่อเพิ่มความไวของแอพพลิเคชั่น GUI
- เพื่อนำด้านบวกของระบบมัลติโปรเซสเซอร์ไปใช้
- เพื่อปรับปรุงตรรกะการเขียนโปรแกรมในกรณีที่มีอยู่หลายรายการ
มีสองเส้นทางการดำเนินการเมื่อมีการเรียกใช้เธรด เส้นทางหนึ่งในสองเส้นทางใช้สำหรับการดำเนินการของเธรด และอีกเส้นทางหนึ่งจะติดตามคำสั่งต่อท้ายการเรียกใช้เธรด แต่ละเธรดใน Java มีพื้นที่หน่วยความจำและสแต็กแยกกัน
ปัจจัยเสี่ยงที่พบขณะใช้เธรดในโค้ด Java มีดังนี้
- จำเป็นต้องมีการประสานงานที่เหมาะสมระหว่างเธรดในกรณีที่เธรดเข้าถึงตัวแปรทั่วไปเพื่อดูข้อมูลอย่างสม่ำเสมอ
- ประสิทธิภาพและการบำรุงรักษาเธรด หากใช้ในโปรแกรมมากเกินไป จะกลายเป็นเรื่องยุ่งยาก
วงจรชีวิตของเธรดใน Java:
ในขณะดำเนินการโปรแกรมใดๆ เธรดใน Java จะอยู่ในสถานะใดสถานะหนึ่งที่กล่าวถึงด้านล่าง
- ใหม่
- ถูกบล็อก
- เรียกใช้ได้
- หมดเวลารอ
- การรอคอย
- สิ้นสุด
มุมมองโดยละเอียดของ Life Cycle ของเธรดใน Java
หัวข้อใหม่:
เธรดที่สร้างขึ้นใหม่อยู่ในสถานะ 'ใหม่' มันไม่คืบหน้าที่จะเรียกใช้ที่สถานะนี้ การดำเนินการโค้ดของเธรดในสถานะใหม่ยังไม่เกิดขึ้น มันยังไม่ได้เรียกใช้
สถานะที่รันได้:
เธรดในสถานะที่รันได้พร้อมที่จะรัน เธรดในสถานะนี้อาจพร้อมที่จะทำงานได้ตลอดเวลาทันทีหรืออาจกำลังทำงานอยู่ ตัวกำหนดตารางเวลาของเธรดมีหน้าที่รับผิดชอบในการจัดสรรเวลาเพื่อให้เธรดทำงาน แต่ละเธรดจะถูกจัดสรรตามเวลาที่กำหนดในโปรแกรมแบบมัลติเธรด แต่ละเธรดทำงานเป็นระยะเวลาเล็กน้อยและจากนั้นจะพบกับการหยุดชั่วคราว จากนั้น CPU จะถูกละทิ้งไปยังเธรดอื่นเพื่อให้เธรดอื่นมีโอกาสทำงาน ณ จุดนี้ เธรดที่พร้อมรันทั้งหมดที่กำลังรอ CPU และเธรดที่กำลังรันอยู่ในสถานะที่รันได้
ตรวจสอบหลักสูตรเทคโนโลยีฟรีของเราเพื่อรับความได้เปรียบเหนือการแข่งขัน
สำรวจหลักสูตรวิศวกรรมซอฟต์แวร์ยอดนิยมของเรา
วิทยาศาสตรมหาบัณฑิตสาขาวิทยาการคอมพิวเตอร์จาก LJMU & IIITB | โปรแกรมใบรับรองความปลอดภัยทางไซเบอร์ของ Caltech CTME |
Bootcamp การพัฒนาสแต็คเต็มรูปแบบ | โปรแกรม PG ใน Blockchain |
โปรแกรม Executive PG ในการพัฒนา Full Stack | |
ดูหลักสูตรทั้งหมดของเราด้านล่าง | |
หลักสูตรวิศวกรรมซอฟต์แวร์ |
กำลังรอ / สถานะถูกบล็อก:
เธรดอยู่ในสถานะใดสถานะหนึ่งที่กล่าวถึงด้านล่าง เมื่อเธรดไม่ทำงานชั่วคราว
- การรอคอย
- ถูกบล็อก
เธรดที่รอให้ I/O เสร็จสิ้นอยู่ในสถานะถูกบล็อก ฟังก์ชันของตัวกำหนดตารางเวลาของเธรดคือการกำหนดเวลาการดำเนินการของเธรดที่ถูกบล็อกหรือรอโดยการเปิดใช้งานอีกครั้ง เธรดใดๆ ในสถานะนี้ไม่ได้รับอนุญาตให้ดำเนินการต่อไปจนกว่าจะถูกแปลงเป็นสถานะที่รันได้ เธรดในบล็อกหรือสถานะรอไม่ได้ใช้วงจร CPU ใดๆ
เธรดถูกบังคับให้ถูกบล็อกเมื่อพยายามเข้าถึงส่วนที่มีการป้องกันของรหัสซึ่งได้รับการป้องกันโดยเธรดอื่นในปัจจุบัน ตัวกำหนดตารางเวลาจะแปลงหนึ่งในเธรดที่รอส่วนที่ได้รับการป้องกันให้เป็นสถานะที่รันได้ เมื่อส่วนนั้นถูกปลดล็อกสำหรับเธรดทั้งหมด ในทางกลับกัน เธรดอยู่ในสถานะรอในขณะที่รอเธรดอื่นในเงื่อนไขเฉพาะ เธรดในสถานะรอจะถูกพุชไปยังสถานะที่รันได้เมื่อตรงตามเงื่อนไขที่ระบุสำหรับการรอ ถ้าเธรดที่กำลังทำงานอยู่ถูกย้ายไปยังสถานะรอ/ถูกบล็อก ตัวกำหนดตารางเวลาเธรดจะกำหนดเวลาเธรดอื่นจากลำดับที่รันได้ให้รัน
หมดเวลารอ:
เมื่อเมธอดถูกเรียกใช้โดยมีอาร์กิวเมนต์หมดเวลา เธรดจะอยู่ในสถานะรอแบบหมดเวลา เธรดจะยังคงอยู่ในสถานะนี้จนกว่าจะหมดเวลาที่กำหนดหรือจนกว่าจะได้รับการแจ้งเตือน ตัวอย่างเช่น เธรดถูกเลื่อนไปยังสถานะการรอแบบกำหนดเวลา หากเรียกใช้การรอแบบมีเงื่อนไขหรือโหมดสลีป
สถานะสิ้นสุด:
การสิ้นสุดของเธรดเกิดขึ้นเนื่องจากเหตุผลข้อใดข้อหนึ่งต่อไปนี้
- ทางออกปกติของเธรดเมื่อการดำเนินการส่วนโค้ดภายในเธรดเสร็จสิ้น
- การเกิดเหตุการณ์ผิดพลาดที่หาได้ยาก เช่น ข้อยกเว้นที่ไม่ได้รับการจัดการและความผิดพลาดในการแบ่งส่วน
เธรดในสถานะสิ้นสุดจะไม่ใช้รอบ CPU ใดๆ
เรียนรู้หลักสูตรการพัฒนาซอฟต์แวร์ออนไลน์จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโทเพื่อติดตามความก้าวหน้าในอาชีพของคุณอย่างรวดเร็ว
ทักษะการพัฒนาซอฟต์แวร์ตามความต้องการ
หลักสูตร JavaScript | หลักสูตร Core Java | หลักสูตรโครงสร้างข้อมูล |
หลักสูตร Node.js | หลักสูตร SQL | หลักสูตรการพัฒนาสแต็คเต็มรูปแบบ |
หลักสูตร NFT | หลักสูตร DevOps | หลักสูตรข้อมูลขนาดใหญ่ |
หลักสูตร React.js | หลักสูตรความปลอดภัยทางไซเบอร์ | หลักสูตรคลาวด์คอมพิวติ้ง |
หลักสูตรการออกแบบฐานข้อมูล | หลักสูตรหลาม | หลักสูตร Cryptocurrency |
การดำเนินการของสถานะเธรดใน Java:
เพื่อให้บรรลุสถานะปัจจุบันของเธรดใน Java เราใช้วิธีการ Thread.getState() Java ยังมีคลาส java.lang.Thread.State ซึ่งค่าคงที่ ENUM สำหรับสถานะของเธรดจะถูกกำหนดไว้ รายละเอียดโดยสรุปตามตารางด้านล่าง
ประเภทคงที่ | ประกาศ | คำอธิบาย |
ใหม่ | Thread.State สุดท้ายสาธารณะคงที่สถานะใหม่ | เป็นสถานะเธรดของเธรดที่เพิ่งสร้างและยังไม่ได้เริ่มดำเนินการ |
เรียกใช้ได้ | เธรดสุดท้ายแบบคงที่สาธารณะสถานะเรียกใช้ได้ | ซึ่งอธิบายสถานะของเธรดที่กำลังรันอยู่หรือเธรดที่อยู่ในสถานะพร้อมรัน เธรดเดียวกันสามารถอยู่ในสถานะที่รันได้สำหรับ Java Virtual machine และสถานะกำลังรอสำหรับทรัพยากรระบบปฏิบัติการอื่นๆ เช่น โปรเซสเซอร์ |
ถูกบล็อก | เธรดสุดท้ายคงที่สาธารณะ สถานะถูกบล็อก | อธิบายสถานะของเธรดที่ถูกบล็อกเพื่อรอการล็อกจอภาพ มันยังคงอยู่ในสถานะเดิมจนกว่าบล็อกมอนิเตอร์จะเข้าสู่เมธอด/บล็อกที่ซิงโครไนซ์ หรือกลับเข้าสู่เมธอดที่ซิงโครไนซ์อีกครั้งหลังจากเรียกใช้ Object.wait() |
การรอคอย | เธรดสุดท้ายคงที่สาธารณะสถานะกำลังรอ | ซึ่งอธิบายสถานะของเธรดที่กำลังรอเนื่องจากการเรียกใช้หนึ่งในวิธีต่อไปนี้
สถานะการรออาจเป็นเพราะเสร็จสิ้นงานเฉพาะโดยเธรดอื่น |
หมดเวลารอ | เธรดสุดท้ายคงที่สาธารณะ สถานะ TIMED_WAITING | เป็นสถานะของเธรดที่รอเวลาที่กำหนด การเรียกใช้เมธอดใดๆ ต่อไปนี้ส่งผลให้เกิดสถานะการรอตามกำหนดเวลาของเธรดที่มีเวลารอเป็นบวกที่กำหนดไว้
|
สิ้นสุด | เธรดสุดท้ายคงที่สาธารณะสถานะยุติ | เป็นสถานะของเธรดที่เสร็จสิ้นการดำเนินการคำสั่งรหัสส่วนประกอบ |
เธรดอยู่ในสถานะใหม่เมื่อเพิ่งสร้าง เมื่อเรียกใช้เมธอด .start() บนเธรด มันจะถูกย้ายไปยังสถานะที่รันได้โดยตัวกำหนดตารางเวลาเธรด เมื่อมีการเรียกใช้เมธอด join() ในอินสแตนซ์ของเธรด เธรดที่กำลังดำเนินการคำสั่งโค้ดอยู่ในขณะนี้จะรอให้เธรดนี้สิ้นสุดลง ดังนั้น ก่อนที่จะพิมพ์คำสั่งสุดท้ายบนคอนโซล ฟังก์ชัน join() จะถูกเรียกใช้บนเธรด 2 โดยโปรแกรม และปล่อยให้เธรด 1 รอจนกว่าเธรด 2 จะเสร็จสิ้นการดำเนินการและย้ายไปยังสถานะสิ้นสุด เนื่องจากเธรด 1 กำลังรอให้การดำเนินการของเธรด 2 เสร็จสิ้น เธรดจึงอยู่ในสถานะรอ
อ่านบทความยอดนิยมของเราเกี่ยวกับการพัฒนาซอฟต์แวร์
วิธีการใช้ Data Abstraction ใน Java? | Inner Class ใน Java คืออะไร | ตัวระบุ Java: คำจำกัดความ ไวยากรณ์ และตัวอย่าง |
ทำความเข้าใจเกี่ยวกับ Encapsulation ใน OOPS พร้อมตัวอย่าง | อาร์กิวเมนต์บรรทัดคำสั่งใน C อธิบาย | คุณลักษณะและคุณลักษณะ 10 อันดับแรกของ Cloud Computing ในปี 2022 |
ความหลากหลายใน Java: แนวคิด ประเภท ลักษณะ และตัวอย่าง | แพ็คเกจใน Java & วิธีใช้งาน? | บทช่วยสอน Git สำหรับผู้เริ่มต้น: เรียนรู้ Git ตั้งแต่เริ่มต้น |
ข้อดีและข้อจำกัดของการใช้เธรดในโปรแกรม Java:
การใช้เธรดในโปรแกรม Java มีประโยชน์ดังต่อไปนี้
- ลดเวลาในการพัฒนาโค้ด
- ลดค่าใช้จ่ายในการบำรุงรักษา
- เพิ่มประสิทธิภาพของแอพพลิเคชั่นที่ซับซ้อน
- เพิ่มการตอบสนองของอินเทอร์เฟซผู้ใช้
- การเทียบเคียงงาน
- มีการใช้เธรดในแอปพลิเคชันเซิร์ฟเวอร์เพื่อปรับปรุงปริมาณงานสูงและการใช้ทรัพยากร
- หากเธรดไม่สามารถใช้ทรัพยากรการประมวลผลทั้งหมดของ CPU ได้ การเรียกใช้เธรดอื่นจะทำให้สิ่งเหล่านี้ทำงานต่อไป
- หากชุดข้อมูลเดียวกันถูกดำเนินการโดยหลายเธรด แคชของเธรดเหล่านั้นจะสามารถใช้ร่วมกันได้ สิ่งนี้นำไปสู่การใช้แคชหรือการประสานค่าที่ดีขึ้น
มีข้อเสียหลายประการในการใช้เธรดในโปรแกรม Java บางส่วนของพวกเขาอยู่ด้านล่าง
- ในขณะที่ใช้แคชร่วมกัน บัฟเฟอร์ที่มองข้ามการแปล (TLB) หรือทรัพยากรฮาร์ดแวร์อื่นๆ เธรดจำนวนมากอาจรบกวนซึ่งกันและกัน
- แม้ว่าจะมีเพียงเธรดเดียวเท่านั้นที่ทำงานอยู่ เวลาดำเนินการของเธรดก็ไม่สามารถเพิ่มได้ อย่างไรก็ตาม อนุญาตให้ลดเวลาการดำเนินการลงได้ อาจเป็นเพราะขั้นตอนไปป์ไลน์เพิ่มเติมและ/หรือความถี่ที่ช้าลงซึ่งจำเป็นสำหรับที่พักของฮาร์ดแวร์การสลับเธรด
- จำเป็นต้องมีการเปลี่ยนแปลงจำนวนมากทั้งในระบบปฏิบัติการและโปรแกรมแอปพลิเคชันเมื่อเทียบกับการประมวลผลหลายตัว เนื่องจากการสนับสนุนฮาร์ดแวร์จะเปิดเผยต่อซอฟต์แวร์มากกว่าในการทำงานแบบมัลติเธรด
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ Java, การพัฒนาซอฟต์แวร์แบบ full-stack โปรดดูโปรแกรม Executive PG Program ของ upGrad & IIIT-B ในการพัฒนาซอฟต์แวร์ – ความเชี่ยวชาญในการพัฒนาแบบ Full Stack ซึ่งออกแบบมาสำหรับมืออาชีพในการทำงานและให้การฝึกอบรมอย่างเข้มงวดมากกว่า 500 ชั่วโมง , 9+ โครงการและการมอบหมายงาน, สถานะศิษย์เก่า IIIT-B, โครงการที่ลงมือปฏิบัติจริงและความช่วยเหลือด้านงานกับบริษัทชั้นนำ