VisualVM - Trạng thái chuỗi


85

Có thể ai đó xin vui lòng giải thích cho tôi sự khác biệt giữa Sleeping, Wait, Park, và Monitortiểu bang thread VisualVM.

nhập mô tả hình ảnh ở đây

Đây là những gì tôi đã tìm thấy:

Running: luồng vẫn đang chạy.
Sleeping: luồng đang ngủ (phương thức output () đã được gọi trên đối tượng luồng)
Wait: luồng đã bị chặn bởi mutex hoặc một rào cản và đang chờ một luồng khác giải phóng khóa
Park: các luồng đang đỗ sẽ bị treo cho đến khi chúng được cấp phép. Bỏ đánh dấu một luồng thường được thực hiện bằng cách gọi phương thức unark () trên đối tượng luồng
Monitor: các luồng đang đợi một điều kiện trở thành true để tiếp tục thực thi

Những gì tôi không thể hiểu là Park bang, những gì thực sự đình chỉ các chủ đề? Làm cách nào để phát hiện trong mã điều gì đã khiến luồng tạm ngừng thực thi?

Ai đó có thể vui lòng hướng dẫn tôi về vấn đề này.

Cảm ơn.

Câu trả lời:


53

Tôi tìm thấy một sơ đồ rất đẹp mô tả khá nhiều tất cả những gì bạn cần / muốn biết.

nhập mô tả hình ảnh ở đây

  1. Mới

Luồng ở trạng thái mới nếu bạn tạo một thể hiện của lớp Thread nhưng trước khi gọi phương thức start ().

  1. Runnable

Luồng ở trạng thái có thể chạy sau khi gọi phương thức start (), nhưng bộ lập lịch luồng đã không chọn nó làm tiểu trình đang chạy.

  1. Đang chạy

Luồng đang ở trạng thái chạy nếu bộ lập lịch luồng đã chọn nó.

  1. Đã hẹn giờ chờ

Thời gian chờ là trạng thái luồng cho một luồng đang chờ với thời gian chờ được chỉ định. Một luồng đang ở trạng thái chờ theo thời gian do gọi một trong các phương thức sau với thời gian chờ dương được chỉ định:

  • Thread.sleep (thời gian ngủ)
  • Object.wait (thời gian chờ)
  • Thread.join (hết giờ)
  • LockSupport.parkNanos (hết giờ)
  • LockSupport.parkUntil (hết giờ)
  1. Không chạy được (Bị chặn)

Đây là trạng thái khi luồng vẫn còn tồn tại, nhưng hiện không đủ điều kiện để chạy.

  1. Chấm dứt

Một luồng ở trạng thái kết thúc hoặc chết khi phương thức run () của nó thoát.

Hy vọng rằng điều này trả lời câu hỏi của bạn :).

Bãi đậu xe:

Tắt luồng hiện tại cho mục đích lập lịch luồng trừ khi có giấy phép.

Các luồng đang được đỗ hoặc bị treo nếu bạn muốn gọi nó theo cách này vì nó không có quyền thực thi. Sau khi quyền được cấp, luồng sẽ được bỏ đánh dấu và thực thi.

Permit của LockSupport được liên kết với các luồng (nghĩa là giấy phép được cấp cho một luồng cụ thể) và không tích lũy (tức là chỉ có thể có một giấy phép cho mỗi luồng, khi luồng sử dụng giấy phép, nó sẽ biến mất).


Cám ơn phản hồi của bạn. Tôi cũng đã trải qua điều này nhưng không hiểu sao câu hỏi của tôi vẫn chưa được giải đáp. Bạn có thể vui lòng xem lại câu hỏi của tôi; Tôi đã cập nhật nó. Tôi đang đặc biệt tìm kiếm một câu trả lời cho tiểu bang công viên.
Ali Shah Ahmed

cảm ơn một lần nữa cho bản cập nhật. Vì vậy, trong trạng thái công viên, luồng đang chờ nó được lên lịch hay nó đang chờ với một số điều kiện?
Ali Shah Ahmed

@AliShahAhmed Chủ đề đang đợi sự cho phép (điều kiện) để thực thi - nếu điều kiện này không được đáp ứng trong khoảng thời gian chờ nhất định sẽ đạt đến và luồng kết thúc - PS. Xin lỗi vì chậm trễ trả lời haha
Maciej Cygan

39

VisualVM ánh xạ trạng thái luồng Java (như được mô tả trong câu trả lời của @ Maciej) với trạng thái được trình bày trong giao diện người dùng của nó như sau:

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

SleepingParklà các trường hợp chờ đợi (theo thời gian) cụ thể:

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

(Ánh xạ được thực hiện trong ThreadMXBeanDataManager.java.)

Có thể tìm thấy một cuộc thảo luận ngắn gọn (và không có thẩm quyền) về trạng thái luồng Java tại đây .

CHỈNH SỬA ĐỂ THÊM:

Cũng cần lưu ý rằng việc chặn luồng trong các cuộc gọi đến các phương thức gốc xuất hiện trong JVM với tư cách là RUNNABLE, và do đó được VisualVM báo cáo là Running(và là tiêu thụ 100% CPU).


2
Đây phải là câu trả lời chính xác. Câu hỏi là về trạng thái luồng JVisualVM không phải trạng thái luồng JVM.
digital_infinity
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.