บทนำสถานะเธรด Java พร้อมตัวอย่าง – วัฏจักรชีวิตของเธรด

เผยแพร่แล้ว: 2019-01-11
บทนำสถานะเธรด Java พร้อมตัวอย่าง

สถานะกระทู้

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

คุณมาถูกที่แล้วหากคุณมีคำถามใด ๆ ด้านล่าง:

  • วงจรชีวิตของเธรดใน Java
  • วงจรชีวิตและสถานะของเธรดใน Java
  • ทำความเข้าใจสถานะเธรด Java

ส่วนที่เหลือของหน้านี้กล่าวถึง Thread's life cycle ในแง่ของสถานะ

สถานะเธรด Java พร้อมตัวอย่าง

กระทู้ใหม่

คำสั่งต่อไปนี้สร้างเธรดใหม่แต่ไม่ได้เริ่มต้นดังนั้นจึงปล่อยให้เธรดอยู่ในสถานะที่มีป้ายกำกับว่าเธรดใหม่ในไดอะแกรม

เมื่อเธรดอยู่ในสถานะ New Thread นั้นเป็นเพียงออบเจ็กต์เธรดที่ว่างเปล่า ยังไม่มีการจัดสรรทรัพยากรระบบสำหรับมัน ดังนั้นเมื่อเธรดอยู่ในสถานะนี้ คุณสามารถเริ่มต้นหรือหยุดเธรดเท่านั้น การเรียกวิธีการอื่นนอกเหนือจาก start() หรือ stop() เมื่อเธรดอยู่ในสถานะนี้ไม่สมเหตุสมผลและทำให้ IllegalThreadStateException

วิ่งได้

พิจารณาโค้ดสองบรรทัดนี้:

เมธอด start() จะสร้างทรัพยากรระบบที่จำเป็นในการรันเธรด กำหนดเวลาให้เธรดรัน และเรียกใช้เมธอด run() ของเธรด ณ จุดนี้เธรดอยู่ในสถานะ "รันได้" สถานะนี้เรียกว่า "รันได้" แทนที่จะเป็น "กำลังทำงาน" เนื่องจากเธรดอาจไม่ทำงานจริงเมื่ออยู่ในสถานะนี้ คอมพิวเตอร์หลายเครื่องมีโปรเซสเซอร์เดียว ทำให้ไม่สามารถเรียกใช้เธรด "Runnable" ทั้งหมดพร้อมกันได้

ดังนั้น ระบบรันไทม์ของ Java ต้องใช้โครงร่างการตั้งเวลาที่แชร์โปรเซสเซอร์ระหว่างเธรด "Runnable" ทั้งหมด อย่างไรก็ตาม สำหรับวัตถุประสงค์ส่วนใหญ่ คุณสามารถนึกถึงสถานะ "วิ่งได้" ว่าเป็นเพียง "กำลังทำงาน" เมื่อเธรดกำลังทำงาน - เป็น "รันได้" และเป็นเธรดปัจจุบัน - คำแนะนำในการ run() กำลังดำเนินการตามลำดับ

รันไม่ได้

เธรดเข้าสู่สถานะ Not Runnable เมื่อหนึ่งในสี่เหตุการณ์เหล่านี้เกิดขึ้น:

  • มีคนเรียกเมธอด suspend() ของมัน
  • มีคนเรียกวิธีการ sleep() ของมัน
  • เธรดใช้เมธอด wait() เพื่อรอตัวแปรเงื่อนไข
  • เธรดกำลังบล็อกบน I/O

ตัวอย่างเช่น ตัวหนาในโค้ดนี้ snippet

ทำให้ myThread เข้าสู่โหมดสลีปเป็นเวลา 10 วินาที (10,000 มิลลิวินาที) ในช่วง 10 วินาทีนั้น แม้ว่าโปรเซสเซอร์จะพร้อมใช้งาน myThread ก็จะไม่ทำงาน หลังจาก 10 วินาทีขึ้นไป myThread จะกลายเป็น "Runnable" อีกครั้งและตอนนี้หากโปรเซสเซอร์พร้อมใช้งาน myThread ก็จะทำงานได้

สำหรับแต่ละ "ทางเข้า" เข้าสู่สถานะ "ไม่สามารถทำงานได้" ที่ระบุไว้ข้างต้น มีเส้นทางหลบหนีที่เฉพาะเจาะจงและชัดเจนซึ่งส่งคืนเธรดไปยังสถานะ "เรียกใช้ได้" เส้นทางหลบหนีใช้ได้เฉพาะกับ "ทางเข้า" ที่เกี่ยวข้องเท่านั้น ตัวอย่างเช่น หากเธรดเข้าสู่โหมดสลีป จำนวนมิลลิวินาทีที่ระบุจะต้องผ่านไปก่อนที่เธรดจะกลายเป็น “รันได้” อีกครั้ง การเรียก resume() บนเธรดสลีปไม่มีผล

ข้อมูลต่อไปนี้ระบุเส้นทางหลบหนีสำหรับการเข้าสู่สถานะ "ไม่สามารถทำงานได้" ทุกครั้ง

  • หากเธรดเข้าสู่โหมดสลีป จะต้องผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ
  • หากเธรดถูกระงับ จะต้องมีผู้เรียกใช้เมธอด resume()
  • หากเธรดกำลังรอตัวแปรเงื่อนไข อ็อบเจ็กต์ใดก็ตามที่เป็นเจ้าของตัวแปรจะต้องละทิ้งมันโดยเรียก notify() หรือ notifyAll()
  • หากเธรดถูกบล็อกบน I/O คำสั่ง I/O ที่ระบุจะต้องเสร็จสิ้น
java-thread-กวดวิชา

ตาย

ด้ายสามารถตายได้สองวิธี: จากสาเหตุตามธรรมชาติหรือโดยการถูกฆ่า (หยุด) เธรดตายตามธรรมชาติเมื่อเมธอด run() ออกตามปกติ ตัวอย่างเช่น วง while ในเมธอดนี้เป็นวงจำกัด มันจะวนซ้ำ 100 ครั้งแล้วออก

เธรดที่มีเมธอด run() นี้จะตายตามธรรมชาติหลังจากลูปและเมธอด run() เสร็จสิ้น

คุณยังสามารถฆ่าเธรดได้ตลอดเวลาโดยเรียกใช้เมธอด stop() ข้อมูลโค้ดนี้

สร้างและเริ่ม myThread จากนั้นให้เธรดปัจจุบันเข้าสู่โหมดสลีปเป็นเวลา 10 วินาที เมื่อเธรดปัจจุบันตื่นขึ้น บรรทัดตัวหนาในส่วนโค้ดจะฆ่า myThread

เมธอด stop() จะส่งออบเจ็กต์ ThreadDeath ไปที่เธรดเพื่อฆ่ามัน ดังนั้นเมื่อเธรดถูกฆ่าในลักษณะนี้ เธรดนั้นก็จะตายแบบอะซิงโครนัส เธรดจะตายเมื่อได้รับข้อยกเว้น ThreadDeath จริง

IllegalThreadStateException

ระบบรันไทม์แสดง IllegalThreadStateException เมื่อคุณเรียกใช้เมธอดบนเธรด และสถานะของเธรดนั้นไม่อนุญาตให้มีการเรียกเมธอดนั้น ตัวอย่างเช่น IllegalThreadStateException เกิดขึ้นเมื่อคุณเรียก suspend() บนเธรดที่ไม่ใช่ "Runnable"

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

isAlive() Method

และคำสุดท้ายเกี่ยวกับสถานะเธรด: อินเทอร์เฟซการเขียนโปรแกรมสำหรับคลาสเธรดรวมถึงเมธอดที่เรียกว่า isAlive() isAlive() คืนค่า จริง หากเธรดเริ่มต้นและไม่หยุด ดังนั้น หากเมธอด isAlive() ส่งคืนค่า เท็จ คุณจะรู้ว่าเธรดนั้นเป็น "เธรดใหม่" หรือ "ตาย"

หากเมธอด isAlive() คืนค่า true คุณจะรู้ว่าเธรดนั้นเป็น “Runnable” หรือ “Not Runnable” คุณไม่สามารถแยกความแตกต่างระหว่างเธรด "เธรดใหม่" และเธรด "ที่ตายแล้ว" และคุณไม่สามารถแยกความแตกต่างระหว่างเธรด "Runnable" และเธรด "Not Runnable"

ในขณะที่ดูตัวอย่างเธรดที่ซับซ้อนพบว่าบทช่วยสอนที่ยอดเยี่ยมนี้บนเน็ต ทุกคนควรอ่านอย่างระมัดระวัง