VisualVM - สถานะเธรด


86

ใครจะกรุณาอธิบายให้ฉันความแตกต่างระหว่างSleeping, Wait, ParkและMonitorรัฐตั้งกระทู้ใน VisualVM

ใส่คำอธิบายภาพที่นี่

นี่คือสิ่งที่ฉันพบ:

Running: thread ยังคงทำงานอยู่
Sleeping: thread is sleeping (method yield () ถูกเรียกบนอ็อบเจ็กต์เธรด)
Wait: เธรดถูกบล็อกโดย mutex หรือสิ่งกีดขวางและกำลังรอให้เธรดอื่นคลายการล็อก
Parkเธรดที่จอดอยู่จะถูกระงับจนกว่าจะได้รับอนุญาต โดยปกติแล้วการยกเลิกการจอดเธรดทำได้โดยการเรียกเมธอด uncark () บนอ็อบเจ็กต์เธรด
Monitor: เธรดกำลังรอเงื่อนไขที่จะเป็นจริงเพื่อดำเนินการต่อ

สิ่งที่ฉันไม่เข้าใจคือสวนสาธารณะสิ่งที่ระงับเธรดจริงหรือ? ฉันจะตรวจจับโค้ดที่ทำให้เธรดระงับการทำงานได้อย่างไร

ใครช่วยแนะนำฉันในเรื่องนี้

ขอบคุณ.

คำตอบ:


53

ฉันพบแผนภาพที่ดีมากซึ่งอธิบายสิ่งที่คุณต้องการ / ต้องการทราบได้ดี

ใส่คำอธิบายภาพที่นี่

  1. ใหม่

เธรดอยู่ในสถานะใหม่หากคุณสร้างอินสแตนซ์ของคลาสเธรด แต่อยู่ก่อนการเรียกใช้เมธอด start ()

  1. รันได้

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

  1. วิ่ง

เธรดอยู่ในสถานะรันหากตัวกำหนดตารางเวลาเธรดได้เลือกไว้

  1. หมดเวลารอ

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

  • Thread.sleep (เวลานอน)
  • Object.wait (หมดเวลา)
  • Thread.join (หมดเวลา)
  • LockSupport.parkNanos (หมดเวลา)
  • LockSupport.parkUntil (หมดเวลา)
  1. ไม่สามารถรันได้ (ถูกบล็อก)

นี่คือสถานะเมื่อเธรดยังมีชีวิตอยู่ แต่ในขณะนี้ไม่มีสิทธิ์เรียกใช้

  1. สิ้นสุด

เธรดอยู่ในสถานะสิ้นสุดหรือตายเมื่อเมธอด run () ออก

หวังว่านี่จะตอบคำถามของคุณ :)

ที่จอดรถ:

ปิดใช้งานเธรดปัจจุบันเพื่อจุดประสงค์ในการตั้งเวลาเธรดเว้นแต่จะมีใบอนุญาต

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

ใบอนุญาตของ LockSupport เชื่อมโยงกับเธรด (เช่นอนุญาตให้กับเธรดเฉพาะ) และไม่สะสม (กล่าวคือสามารถมีได้เพียงหนึ่งใบอนุญาตต่อเธรดเมื่อเธรดใช้การอนุญาตมันจะหายไป)


ขอบคุณสำหรับคำตอบของคุณ ฉันก็ผ่านสิ่งนี้เช่นกัน แต่คำถามของฉันยังคงไม่มีคำตอบ คุณช่วยตอบคำถามของฉันอีกครั้งได้ไหม ฉันได้อัปเดตแล้ว ฉันกำลังมองหาคำตอบเป็นพิเศษเกี่ยวกับรัฐอุทยาน
Ali Shah Ahmed

ขอบคุณอีกครั้งสำหรับการอัปเดต ดังนั้นในสถานะของอุทยานเธรดกำลังรอให้ถึงกำหนดเวลาหรือกำลังรออยู่ในเงื่อนไขบางอย่าง?
Ali Shah Ahmed

@AliShahAhmed Thread กำลังรอการอนุญาต (เงื่อนไข) เพื่อดำเนินการ - หากไม่ตรงตามเงื่อนไขนี้ในช่วงเวลาที่กำหนดหมดเวลาและเธรดสิ้นสุด - PS ขออภัยที่ตอบล่าช้าฮ่า ๆ
Maciej Cygan

40

VisualVM แมปสถานะเธรด Java (ตามที่อธิบายไว้ในคำตอบของ @ Maciej) กับสถานะที่แสดงใน UI ดังต่อไปนี้:

BLOCKED -> Monitor
RUNNABLE -> Running
WAITING/TIMED_WAITING -> Sleeping/Park/Wait (see below)
TERMINATED/NEW -> Zombie

SleepingและParkเป็นกรณีเฉพาะของการรอ (หมดเวลา):

Sleeping: specifically waiting in Thread.sleep().  
Park:     specifically waiting in sun.misc.Unsafe.park() (presumably via LockSupport).

(การทำแผนที่จะดำเนินการในThreadMXBeanDataManager.java)

อภิปรายของรัฐด้าย Java สั้น ๆ (และไม่มีสิทธิ์) สามารถพบได้ที่นี่

แก้ไขเพื่อเพิ่ม:

นอกจากนี้ยังควรสังเกตด้วยว่าเธรดที่บล็อกในการโทรไปยังเมธอดดั้งเดิมจะปรากฏใน JVM RUNNABLEด้วยและด้วยเหตุนี้ VisualVM จึงรายงานว่าRunning(และใช้ CPU 100%)


3
นี่น่าจะเป็นคำตอบที่ถูกต้อง คำถามเกี่ยวกับสถานะเธรด JVisualVM ไม่ใช่สถานะเธรด JVM
digital_infinity
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.