Tôi sử dụng visualVM kết nối một ứng dụng Java đa luồng, luồng có 4 trạng thái là đang chạy, đang ngủ, đang chờ, đang theo dõi. Trạng thái Giám sát này có nghĩa là gì? Sự khác biệt giữa chờ và Màn hình là gì?
Câu trả lời:
Các trạng thái này giống như đã đề cập trong Thread.State
enum. "Chờ" có nghĩa là, như tài liệu cho biết:
Một luồng đang ở trạng thái chờ do gọi một trong các phương thức sau:
- Object.wait mà không có thời gian chờ
- Thread.join mà không có thời gian chờ
- LockSupport.park
"Màn hình" là BLOCKED
trạng thái, trong đó luồng đang đợi để có được khóa trên một đối tượng (vì nó đang cố gắng nhập một synchronized
khối hoặc phương thức trong khi một luồng khác đã giữ khóa được liên kết).
sleeping
và waiting
được hiển thị trong ảnh chụp màn hình là gì ?!
Đó không phải là trạng thái "giám sát" ... Nó chỉ ra rằng luồng đang ở Thread.State.BLOCKED
trạng thái. Tôi thấy có một câu trả lời hay khác, tôi sẽ chỉ bạn đến liên kết này để giải thích sâu hơn
Màn hình sẽ có nghĩa là luồng đang đợi để đạt được khóa trên một đối tượng. Ví dụ: khi một luồng đang chạy một phương thức được đồng bộ hóa và một luồng khác cố gắng gọi nó trên cùng một đối tượng, nó sẽ không thể thực hiện cho đến khi kết thúc lần gọi đầu tiên của phương thức. Điều này là do luồng đầu tiên có một màn hình hoặc khóa trên đối tượng đó, vì vậy luồng thứ hai phải đợi cho đến khi nó được phát hành.
Từ Hướng dẫn phân luồng Oracle :
"Đồng bộ hóa được xây dựng xung quanh một thực thể bên trong được gọi là khóa nội tại hoặc khóa màn hình. (Đặc điểm kỹ thuật API thường đề cập đến thực thể này đơn giản là" màn hình ".) Khóa nội tại đóng một vai trò trong cả hai khía cạnh của đồng bộ hóa: thực thi quyền truy cập độc quyền vào một trạng thái của đối tượng và thiết lập các mối quan hệ xảy ra trước khi cần thiết cho khả năng hiển thị. "