วงจรชีวิตของเธรดและสถานะของเธรด - 1

“สวัสดี อามีโก้!”

"เรากำลังจะเริ่มหัวข้อใหม่: เธรด"

"เริ่มกันเลย วันนี้เราจะตรวจสอบสถานะที่วัตถุเธรดผ่าน (หรืออาจผ่าน) เมื่อเธรดกำลังทำงาน"

"ตอนนี้คุณสามารถตั้งชื่อได้กี่รัฐ Amigo"

"สอง เธรดแรกคือเธรดก่อนที่จะเรียกใช้เมธอด start(): มีวัตถุอยู่ แต่เธรดยังไม่เปิดใช้งาน และอันที่สองคือหลังจากเมธอด start() ถูกเรียกใช้: เมื่อเธรดกำลังทำอะไรบางอย่าง สำคัญ."

"คุณพูดถูก—มีความแตกต่างเช่นนี้ สถานะเหล่านี้เรียกว่าใหม่และกำลังทำงานอยู่แต่นั่นเป็นเพียงจุดเริ่มต้น"

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

"แต่ยังมีมากกว่านั้น อย่าลืมว่า ณ เวลาหนึ่งๆ เธรดเดียวเท่านั้นที่กำลังทำงานจริง สิ่งที่ดูเหมือนจะทำงานพร้อมกันคือโปรเซสเซอร์กระโดดอย่างต่อเนื่องจากเธรดหนึ่งไปยังอีกเธรด มีสถานะแยกต่างหากเมื่อเธรดดูเหมือนจะเป็น กำลังทำงานอยู่ แต่จริง ๆ แล้วกำลังรอถึงตาของมัน: มันเรียกว่าready -to-runเมื่อเธรดทำงาน มันจะเปลี่ยนจากการรันเป็นreadyอย่างต่อเนื่อง

"ทันทีหลังจาก เรียกใช้เมธอด start () เธรดจะถูกกำหนด สถานะ พร้อมรันและวางไว้ในรายการเธรดที่ใช้ร่วมกันที่ JVM สลับระหว่าง"

"นั่นไม่ใช่เรื่องยากเกินไป ก่อนที่มันจะเริ่มทำงาน มันมี สถานะ ใหม่หลังจากมันเสร็จสิ้น มันจะถูกยกเลิกเมื่อมันทำงาน เธรดอยู่ใน สถานะ ทำงานจากนั้นเมื่อมันกำลังรอ มันอยู่ในสถานะพร้อม "

"ความกะทัดรัดของคุณน่าทึ่ง แต่คุณพูดถูก"

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

"นี่คือลักษณะของสถานการณ์นี้กับรัฐ:"

วงจรชีวิตของเธรดและสถานะของเธรด - 2

"แต่ยังมีมากกว่านั้น ยังมีสถานะที่แยกจากกันซึ่งเรียกว่าการรอนี่คือเมื่อเธรดไม่ได้ถูกบล็อกแต่ก็ไม่พร้อม เช่นกัน ตัวอย่างเช่น เมื่อคุณเรียกเมธอดjoin () บนเธรดอื่น"

เมื่อเราเรียกใช้การเข้าร่วม () บนออบเจกต์เธรดอื่น มันเหมือนกับว่าเธรดของเรา «เข้าร่วม» มัน แต่ในความเป็นจริง มันเพียงแค่รอให้เธรดอื่นทำงานจนเสร็จ

"นอกจากนี้ยังมี เมธอด wait () (จาก wait/notify/notifyAll ทั้งสามเมธอด) ซึ่งจะสลับเธรดเป็นสถานะรอเมื่อมีการเรียก"

"โว้ว."

"เดี๋ยวก่อน! ยังมีอีกมาก เธรดสามารถนอนหลับได้โดยการเรียกวิธีสลีป นอกจากนี้ยังมีสถานะแยกต่างหากสำหรับสิ่งนี้ เรียกว่า « หมดเวลารอ» « หมดเวลารอ » หมายถึงเธรดกำลังรอบางอย่างเพื่อ เวลาจำกัด หากคุณเรียกใช้เมธอด wait ด้วยพารามิเตอร์ เช่น wait(timeout) หรือ join(timeout) เธรดจะเข้าสู่สถานะการรอแบบหมดเวลา"

"นี่คือไดอะแกรมแบบเต็ม:"

วงจรชีวิตของเธรดและสถานะของเธรด - 3

“หืม แค่นั้นเหรอ หรือมีอีก 10 สถานะที่น่าสนใจ?”

"พอแค่นี้ก่อน"

"ในทางปฏิบัติ คุณจำไดอะแกรมแรกได้ง่ายกว่า แต่อันที่สองแม่นยำกว่า"

"น่าแปลกที่ มีไดอะแกรมสถานะของเธรดจำนวนมากบนอินเทอร์เน็ต และแตกต่างกันทั้งหมด"

"นั่นคือเหตุผลที่ฉันให้ไดอะแกรมนี้แก่คุณ - มันสมบูรณ์และถูกต้องที่สุด"

"ในไดอะแกรมนี้ สถานะพร้อมและกำลังทำงานจะรวมกันเป็นบล็อกเดียวที่เรียกว่า runnable คุณรู้ไหมว่าทำไม"

"ไม่ นี่เป็นครั้งแรกที่ฉันเห็นอะไรแบบนี้"

" คลาส Threadมีคลาสภายในที่เรียกว่าStateเช่นเดียวกับ เมธอด State getState() สาธารณะ "

ตัวอย่าง
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

"คุณสามารถเรียกเมธอดgetState () บน อ็ อบเจกต์เธรด และค้นหาสถานะปัจจุบันของมันได้เสมอ และแน่นอน มันจะเป็นหนึ่งในค่าของ State enum"

"ฉันเข้าใจแล้ว ดังนั้นสถานะจริงจึงอยู่ใน JVM แต่ก็มีสถานะที่คุณสามารถเข้าถึงได้ผ่านโค้ด Java โดยใช้เมธอด State getState()"

“แล้วฉันจะใช้สิ่งนั้นภายใต้สถานการณ์ใด”

"เป็นไปได้มากว่าไม่เคย"

"แต่คุณต้องรู้ว่าเกิดอะไรขึ้นภายในเธรด มิฉะนั้น คุณจะมีบั๊กมากมาย และคุณจะเดาไม่ได้ด้วยซ้ำว่าอะไรเป็นสาเหตุ"

"นอกจากนี้ นายจ้างชอบถามเกี่ยวกับสถานะของเธรดในระหว่างการสัมภาษณ์"