Giả sử bạn hỏi sự khác biệt giữa các trạng thái Thread.State.BLOCKED
và Thread.State.WAITING
(tức là, được trả về bởi t.getState()
)?
Tôi muốn biết sự khác biệt về mức JVM là gì và sự khác biệt trên CPU
Làm việc từ dưới lên, không có sự khác biệt ở cấp phần cứng bởi vì những quốc gia không phải là khái niệm phần cứng . Các chủ đề WAITING và các luồng BLOCKED không sử dụng tài nguyên CPU chút nào. Nếu CPU không chạy mã chương trình của bạn, thì đó là mã chạy thuộc về một số quy trình khác hoặc hệ điều hành; hoặc người nào khác, nó đang ở trạng thái nhàn rỗi không liên quan gì đến Java hoặc JVM.
Sau đó, bạn bỏ qua một lớp - hệ điều hành. Tất cả các JVM thực thi thực hiện các luồng Java bằng cách sử dụng các nguyên thủy luồng được cung cấp bởi hệ điều hành.
Trong hệ điều hành, mỗi chuỗi được đại diện bởi một đối tượng chứa tất cả thông tin mà hệ điều hành cần biết về chuỗi. Khi một luồng đang chạy trên một số CPU, đối tượng sẽ báo cho hệ điều hành biết CPU và thời gian nó đang chạy, vv Khi một luồng không chạy, đối tượng chứa ảnh chụp nhanh của trạng thái CPU phải được khôi phục để làm cho thread chạy một lần nữa.
Mỗi đối tượng chuỗi trong hệ điều hành có thể tìm thấy trong một trong nhiều thùng chứa: Có một vùng chứa tập hợp tất cả các chuỗi đang chạy và có các vùng chứa khác (chủ yếu là hàng đợi) giữ chủ đề không chạy.
Thông thường có hàng đợi chạy chạy giữ các chuỗi đã sẵn sàng chạy, nhưng đang chờ CPU chạy. Sau đó, có một hàng đợi cho mỗi mutex (a.k.a., khóa) chứa đề chờ đợi để nhập mà mutex, một hàng đợi cho mỗi biến trạng chứa chủ đề đang chờ để được notify()
d về căn bệnh đó, vv
Bất cứ khi nào một số chủ đề để lại một mutex, các hệ điều hành nhìn vào hàng đợi cho mutex đó. Nếu hàng đợi không trống, nó sẽ chọn một chuỗi từ hàng đợi đó và di chuyển nó đến hàng đợi chạy. Bất cứ khi nào một số thread gọi o.notify()
, hệ điều hành chọn một chuỗi từ hàng đợi của biến điều kiện đó và di chuyển nó đến hàng đợi chạy hoặc, nếu chương trình gọi notifyAll()
, hệ điều hành sẽ di chuyển tất cả chuỗi từ hàng đợi đó đến hàng đợi chạy.
Vì vậy, ở cấp hệ điều hành, nó không hẳn là một câu hỏi về những gì bang là thread trong, vì nó là một câu hỏi trong đó đợi là thread trong.
Cuối cùng , ở cấp độ JVM, không có nhiều điều để nói bởi vì JVM cho phép hệ điều hành thực hiện khá nhiều công việc. Java cung cấp hai trạng thái, RUNNING và WAITING đơn thuần là một tiện ích cho bạn, lập trình viên, trong trường hợp nó hữu ích cho bạn để biết sự khác biệt. (Gợi ý: Thật thú vị khi bạn nhìn vào một bãi chứa chương trình, và cố gắng tìm hiểu xem mỗi luồng đang hoạt động vào thời điểm nào.)
cảm ơn rất nhiều. vấn đề này nhiều ngày của tôi .. cảm ơn câu trả lời của bạn .. tôi đã hiểu 。。 – Timi