วงจรชีวิตของเธรดใน Java

เผยแพร่แล้ว: 2023-01-27

สารบัญ

พื้นฐานของเธรด Java:

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

การใช้เธรดใน Java:

    • เพื่อดำเนินการพื้นหลังหรือการประมวลผลแบบอะซิงโครนัส
    • เพื่อเพิ่มความไวของแอพพลิเคชั่น GUI
    • เพื่อนำด้านบวกของระบบมัลติโปรเซสเซอร์ไปใช้
    • เพื่อปรับปรุงตรรกะการเขียนโปรแกรมในกรณีที่มีอยู่หลายรายการ

มีสองเส้นทางการดำเนินการเมื่อมีการเรียกใช้เธรด เส้นทางหนึ่งในสองเส้นทางใช้สำหรับการดำเนินการของเธรด และอีกเส้นทางหนึ่งจะติดตามคำสั่งต่อท้ายการเรียกใช้เธรด แต่ละเธรดใน Java มีพื้นที่หน่วยความจำและสแต็กแยกกัน

ปัจจัยเสี่ยงที่พบขณะใช้เธรดในโค้ด Java มีดังนี้

  • จำเป็นต้องมีการประสานงานที่เหมาะสมระหว่างเธรดในกรณีที่เธรดเข้าถึงตัวแปรทั่วไปเพื่อดูข้อมูลอย่างสม่ำเสมอ
  • ประสิทธิภาพและการบำรุงรักษาเธรด หากใช้ในโปรแกรมมากเกินไป จะกลายเป็นเรื่องยุ่งยาก

วงจรชีวิตของเธรดใน Java:

ในขณะดำเนินการโปรแกรมใดๆ เธรดใน Java จะอยู่ในสถานะใดสถานะหนึ่งที่กล่าวถึงด้านล่าง

  1. ใหม่
  2. ถูกบล็อก
  3. เรียกใช้ได้
  4. หมดเวลารอ
  5. การรอคอย
  6. สิ้นสุด

มุมมองโดยละเอียดของ 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()
การรอคอย เธรดสุดท้ายคงที่สาธารณะสถานะกำลังรอ ซึ่งอธิบายสถานะของเธรดที่กำลังรอเนื่องจากการเรียกใช้หนึ่งในวิธีต่อไปนี้

  1. Object.wait โดยไม่มีระยะหมดเวลา
  2. LockSupport.park
  3. Thread.join โดยไม่มีระยะหมดเวลา

สถานะการรออาจเป็นเพราะเสร็จสิ้นงานเฉพาะโดยเธรดอื่น

หมดเวลารอ เธรดสุดท้ายคงที่สาธารณะ สถานะ TIMED_WAITING เป็นสถานะของเธรดที่รอเวลาที่กำหนด การเรียกใช้เมธอดใดๆ ต่อไปนี้ส่งผลให้เกิดสถานะการรอตามกำหนดเวลาของเธรดที่มีเวลารอเป็นบวกที่กำหนดไว้

  1. Thread.join กับหมดเวลา
  2. Object.wait โดยหมดเวลา
  3. LockSupport.partจนกว่า
  4. LockSupport.parkNanos
สิ้นสุด เธรดสุดท้ายคงที่สาธารณะสถานะยุติ เป็นสถานะของเธรดที่เสร็จสิ้นการดำเนินการคำสั่งรหัสส่วนประกอบ

เธรดอยู่ในสถานะใหม่เมื่อเพิ่งสร้าง เมื่อเรียกใช้เมธอด .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, โครงการที่ลงมือปฏิบัติจริงและความช่วยเหลือด้านงานกับบริษัทชั้นนำ

ต้องการแบ่งปันบทความนี้หรือไม่?

เตรียมพร้อมสำหรับอาชีพแห่งอนาคต

สมัครเลยสำหรับปริญญาโทสาขาวิศวกรรมซอฟต์แวร์