“สวัสดี อามีโก้!”
"เรากำลังจะเริ่มหัวข้อใหม่: เธรด"
"เริ่มกันเลย วันนี้เราจะตรวจสอบสถานะที่วัตถุเธรดผ่าน (หรืออาจผ่าน) เมื่อเธรดกำลังทำงาน"
"ตอนนี้คุณสามารถตั้งชื่อได้กี่รัฐ Amigo"
"สอง เธรดแรกคือเธรดก่อนที่จะเรียกใช้เมธอด start(): มีวัตถุอยู่ แต่เธรดยังไม่เปิดใช้งาน และอันที่สองคือหลังจากเมธอด start() ถูกเรียกใช้: เมื่อเธรดกำลังทำอะไรบางอย่าง สำคัญ."
"คุณพูดถูก—มีความแตกต่างเช่นนี้ สถานะเหล่านี้เรียกว่าใหม่และกำลังทำงานอยู่แต่นั่นเป็นเพียงจุดเริ่มต้น"
"อย่างแรก ในบางจุดเธรดจะเสร็จสิ้นการทำงาน ซึ่งหมายความว่าอาจมีสถานการณ์ที่วัตถุเธรดมีอยู่ แต่เธรดไม่ได้อยู่ในสถานะใหม่หรือกำลังทำงาน "สถานะนี้ซึ่งเธรดทำงานเสร็จแล้วเรียกว่ายุติ ”
"แต่ยังมีมากกว่านั้น อย่าลืมว่า ณ เวลาหนึ่งๆ เธรดเดียวเท่านั้นที่กำลังทำงานจริง สิ่งที่ดูเหมือนจะทำงานพร้อมกันคือโปรเซสเซอร์กระโดดอย่างต่อเนื่องจากเธรดหนึ่งไปยังอีกเธรด มีสถานะแยกต่างหากเมื่อเธรดดูเหมือนจะเป็น กำลังทำงานอยู่ แต่จริง ๆ แล้วกำลังรอถึงตาของมัน: มันเรียกว่าready -to-runเมื่อเธรดทำงาน มันจะเปลี่ยนจากการรันเป็นreadyอย่างต่อเนื่อง
"ทันทีหลังจาก เรียกใช้เมธอด start () เธรดจะถูกกำหนด สถานะ พร้อมรันและวางไว้ในรายการเธรดที่ใช้ร่วมกันที่ JVM สลับระหว่าง"
"นั่นไม่ใช่เรื่องยากเกินไป ก่อนที่มันจะเริ่มทำงาน มันมี สถานะ ใหม่หลังจากมันเสร็จสิ้น มันจะถูกยกเลิกเมื่อมันทำงาน เธรดอยู่ใน สถานะ ทำงานจากนั้นเมื่อมันกำลังรอ มันอยู่ในสถานะพร้อม "
"ความกะทัดรัดของคุณน่าทึ่ง แต่คุณพูดถูก"
"แต่มีมากกว่านั้น เธรดสามารถถูกบล็อกได้ ตัวอย่างเช่น เมื่อคุณเข้าสู่บล็อกซิงโครไนซ์ หากเธรดเข้าสู่บล็อกโค้ดที่ทำเครื่องหมายว่าซิงโครไนซ์และเธรดอื่นกำลังใช้งานอยู่ เธรดของเราจะเข้าสู่ สถานะ ถูกบล็อกและจะรอ เพื่อให้ mutex (ล็อค) ของวัตถุถูกปล่อยออกมา"
"นี่คือลักษณะของสถานการณ์นี้กับรัฐ:"
"แต่ยังมีมากกว่านั้น ยังมีสถานะที่แยกจากกันซึ่งเรียกว่าการรอนี่คือเมื่อเธรดไม่ได้ถูกบล็อกแต่ก็ไม่พร้อม เช่นกัน ตัวอย่างเช่น เมื่อคุณเรียกเมธอดjoin () บนเธรดอื่น"
เมื่อเราเรียกใช้การเข้าร่วม () บนออบเจกต์เธรดอื่น มันเหมือนกับว่าเธรดของเรา «เข้าร่วม» มัน แต่ในความเป็นจริง มันเพียงแค่รอให้เธรดอื่นทำงานจนเสร็จ
"นอกจากนี้ยังมี เมธอด wait () (จาก wait/notify/notifyAll ทั้งสามเมธอด) ซึ่งจะสลับเธรดเป็นสถานะรอเมื่อมีการเรียก"
"โว้ว."
"เดี๋ยวก่อน! ยังมีอีกมาก เธรดสามารถนอนหลับได้โดยการเรียกวิธีสลีป นอกจากนี้ยังมีสถานะแยกต่างหากสำหรับสิ่งนี้ เรียกว่า « หมดเวลารอ» « หมดเวลารอ » หมายถึงเธรดกำลังรอบางอย่างเพื่อ เวลาจำกัด หากคุณเรียกใช้เมธอด wait ด้วยพารามิเตอร์ เช่น wait(timeout) หรือ join(timeout) เธรดจะเข้าสู่สถานะการรอแบบหมดเวลา"
"นี่คือไดอะแกรมแบบเต็ม:"
“หืม แค่นั้นเหรอ หรือมีอีก 10 สถานะที่น่าสนใจ?”
"พอแค่นี้ก่อน"
"ในทางปฏิบัติ คุณจำไดอะแกรมแรกได้ง่ายกว่า แต่อันที่สองแม่นยำกว่า"
"น่าแปลกที่ มีไดอะแกรมสถานะของเธรดจำนวนมากบนอินเทอร์เน็ต และแตกต่างกันทั้งหมด"
"นั่นคือเหตุผลที่ฉันให้ไดอะแกรมนี้แก่คุณ - มันสมบูรณ์และถูกต้องที่สุด"
"ในไดอะแกรมนี้ สถานะพร้อมและกำลังทำงานจะรวมกันเป็นบล็อกเดียวที่เรียกว่า runnable คุณรู้ไหมว่าทำไม"
"ไม่ นี่เป็นครั้งแรกที่ฉันเห็นอะไรแบบนี้"
" คลาส Threadมีคลาสภายในที่เรียกว่าStateเช่นเดียวกับ เมธอด State getState() สาธารณะ "
public enum State
{
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
"คุณสามารถเรียกเมธอดgetState () บน อ็ อบเจกต์เธรด และค้นหาสถานะปัจจุบันของมันได้เสมอ และแน่นอน มันจะเป็นหนึ่งในค่าของ State enum"
"ฉันเข้าใจแล้ว ดังนั้นสถานะจริงจึงอยู่ใน JVM แต่ก็มีสถานะที่คุณสามารถเข้าถึงได้ผ่านโค้ด Java โดยใช้เมธอด State getState()"
“แล้วฉันจะใช้สิ่งนั้นภายใต้สถานการณ์ใด”
"เป็นไปได้มากว่าไม่เคย"
"แต่คุณต้องรู้ว่าเกิดอะไรขึ้นภายในเธรด มิฉะนั้น คุณจะมีบั๊กมากมาย และคุณจะเดาไม่ได้ด้วยซ้ำว่าอะไรเป็นสาเหตุ"
"นอกจากนี้ นายจ้างชอบถามเกี่ยวกับสถานะของเธรดในระหว่างการสัมภาษณ์"
GO TO FULL VERSION