-
สถานะของวัตถุทั้งหมดคืออะไร
Thread
?- ใหม่
- วิ่งได้
- ถูกบล็อก
- ซึ่งรอคอย
- TIMED_WAITING
- สิ้นสุด
-
เธรดสามารถไปสถานะใดเมื่อเข้าสู่บล็อก
synchronized
?- วิ่งได้
- ถูกบล็อก
ใน RUNNABLE ถ้าบล็อกของโค้ดที่ทำเครื่องหมาย
synchronized
ไม่ถูกครอบครองโดยเธรดอื่น มิฉะนั้น เธรดของเราจะได้รับสถานะ BLOCKED และจะรอให้อ็อบเจ็กต์ mutex ถูกปล่อยออกมา - เธรดจะอยู่ในสถานะใดเมื่อเรียกใช้เมธอด
wait()
?การเรียกเมธอดนี้จะทำให้เธรดอยู่ในสถานะรอ
วิธีการนี้wait()
สามารถเรียกได้ภายในบล็อกsynchronized
บนวัตถุ mutex ที่ถูก "ล็อค" โดยเธรดปัจจุบันเท่านั้น มิฉะนั้น วิธีการจะส่งข้อ ยกเว้น IllegalMonitorStateExceptionObject monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
เมื่อเรียกใช้เมธอดwait()
เธรดปัจจุบันจะปลดล็อกจากอ็อบเจ็กต์ และเข้าสู่สถานะ WAITING โดยรอให้ เธรดอื่นmonitor
เรียกใช้monitor.notify()
เมธอดmonitor.notifyAll()
ทันทีที่เกิดเหตุการณ์นี้ เธรดจะเริ่มทำงาน และหากจอภาพไม่ยุ่ง เธรดก็จะดึงเธรดนั้นและทำงานต่อไป
หากมอนิเตอร์ถูกครอบครองโดยเธรดอื่น เธรดปัจจุบันจะเข้าสู่สถานะ BLOCKED -
เธรดจะอยู่ในสถานะใดเมื่อเรียกใช้เมธอด
การเรียกเมธอดนี้จะทำให้เธรดอยู่ในสถานะ TIMED_WAITING โดยการ เปรียบเทียบwait(500)
?
กับเมธอดจะสามารถเรียกได้เฉพาะภายในบล็อกบนอ็อบเจ็กต์ mutex ที่ถูก "ล็อค (ล็อค)" โดยเธรดปัจจุบันwait()
wait(timeout)
synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
เมื่อเรียกใช้เมธอด เธรด
wait()
ปัจจุบันจะปลดล็อกจากวัตถุmonitor
และเข้าสู่โหมดสลีปเป็นเวลา 500 มิลลิวินาที วัตถุmonitor
อาจถูกดักจับโดยเธรดอื่น
หลังจากผ่านไป 500 มิลลิวินาที เธรดจะเริ่มทำงาน และหากmonitor
เธรดไม่ยุ่ง เธรดก็จะดึงเธรดนั้นและทำงานต่อไป
หากมอนิเตอร์ถูกครอบครองโดยเธรดอื่น เธรดปัจจุบันจะเข้าสู่สถานะ BLOCKEDเธรดจะอยู่ในสถานะใดเมื่อเรียกใช้เมธอด
notify()
?Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
หลังจากนั้นmonitor.wait()
เธรดจะเข้าสู่สถานะ WAITING วิธีการnotify()
ที่ถูกเรียกโดยเธรดอื่นบนออบเจ็กต์monitor
จะย้ายเธรดจากสถานะ WAITING ไปเป็นสถานะ RUNNABLE เว้นแต่ว่าวัตถุมอนิเตอร์จะถูกจับโดยเธรดอื่น มิฉะนั้นจะอยู่ในสถานะ BLOCKED -
เธรดจะอยู่ในสถานะใดเมื่อเรียกใช้เมธอด
notifyAll()
?notifyAll()
“จะอยู่” ทุกกระทู้ หนึ่งในเธรด "สลีป" (รอ) จะเข้าสู่สถานะ RUNNABLE เข้าควบคุมมอนิเตอร์ของอ็อบเจ็กต์ที่ใช้งานอยู่และทำงานต่อไป ส่วนที่เหลือจะอยู่ในสถานะถูกบล็อก ทันทีที่เธรด "ตื่น" ตัวแรกปล่อยจอภาพซึ่งทุกคนรอคอย ชะตากรรมของมันจะถูกทำซ้ำในเธรดถัดไป (เธรดที่กำหนดเองจะเปลี่ยนจากสถานะ BLOCKED ไปเป็นสถานะ RUNNABLE) สิ่งนี้จะดำเนินต่อไปจนกว่าเธรดที่ "ตื่นขึ้น" ทั้งหมดจะออกจากสถานะ BLOCKED -
สามเธรดในบล็อกซิงโครไนซ์ที่เรียกว่า
สองอันจะเข้าสู่สถานะ BLOCKED และอีกอันจะเข้าสู่สถานะ RUNNABLEwait()
อ็อบเจ็กต์ mutexnotifyAll()
เธรดเหล่านี้จะอยู่ในสถานะ ใดหากเธรดที่สี่เรียกใช้ -
แตกต่างอย่างไร
แม้ว่าข้อเท็จจริงที่ว่า และjoin(500)
กับwait(500)
?join(500)
จะwait(500)
ถ่ายโอนเธรดปัจจุบันไปยังสถานะ TIMED_WAITING แต่ก็มีความแตกต่างที่สำคัญระหว่างเธรดเหล่านั้น:join(500)
เรียกใช้บนเธรดwait(500)
เรียกใช้ภายในบล็อกที่ซิงโครไนซ์บนออบเจ็กต์ที่บล็อกนี้ซิงโครไนซ์
เมื่อถูกเรียกjoin(500)
เธรดปัจจุบันจะรอ 500 มิลลิวินาทีสำหรับเธรดที่join()
มีการเรียกเมธอดให้เสร็จสิ้น
เมื่อเรียกwait(500)
เธรดปัจจุบันจะปลดล็อกจากออบเจ็กต์ที่ซิงโครไนซ์และเข้าสู่โหมดสลีปเป็นเวลา 500 มิลลิวินาที
หลังจากผ่านไป 500 มิลลิวินาที ในทั้งสองกรณี เธรดจะยังคงทำงานต่อไป -
แตกต่างอย่างไร
wait(500)
กับsleep(500)
?sleep(500)
เรียกบนเธรด เรียกwait(500)
ภายในบล็อกที่ซิงโครไนซ์บนออบเจ็กต์ที่บล็อกนี้ซิงโครไนซ์
เมื่อถูกเรียกsleep(500)
เธรดปัจจุบันจะรอ 500 มิลลิวินาที จากนั้นจึงทำงานต่อไป
เมื่อเรียกwait(500)
เธรดปัจจุบันจะปลดล็อกจากออบเจ็กต์ที่ซิงโครไนซ์และเข้าสู่โหมดสลีปเป็นเวลา 500 มิลลิวินาที -
เธรดจะอยู่ในสถานะใดเมื่อเรียกใช้เมธอด
เมื่อเรียกใช้เมธอดyield()
?yield()
เธรดปัจจุบันจะ "ข้ามเทิร์น" และจาวาจะสลับไปที่การดำเนินการเธรดถัดไปทันที เธรดไปจากรัฐหนึ่งrunning
ไปอีกรัฐready
หนึ่ง สถานะกำลังทำงานและพร้อมเป็นสถานะย่อยของสถานะ RUNNABLE
GO TO FULL VERSION