2017-07-26 31 views
5

Hãy tưởng tượng tôi có 3 luồng với điều kiện chờ và chuỗi thứ 4 có điều kiện thông báo.Chủ đề nào thông báo thức dậy?

Bây giờ, tất cả 3 chuỗi chờ chạy và nhập trạng thái chờ. Một khi điều này được thực hiện, thread thứ 4 chạy và các cuộc gọi thông báo một lần.

Thông báo sẽ xác định chủ đề cần đánh thức như thế nào? Đây có phải là chủ đề được gọi là chủ đề chờ đầu tiên, chủ đề được gọi là chờ đợi cuối cùng hay là nó dựa trên một số điều kiện khác?

Giả sử rằng việc chờ và thông báo sử dụng cùng một khóa.

+3

Một cách ngẫu nhiên, ít nhất là theo ý bạn. Từ đó javadocs: "Nếu bất kỳ chủ đề đang chờ đợi đối tượng này, một trong số chúng được chọn để được đánh thức. Sự lựa chọn là tùy ý và xảy ra theo quyết định của việc thực hiện." – yshavit

Trả lời

7

Theo hiểu biết của tôi, có không sổ sách kế toán đặc biệt - có nghĩa là lựa chọn được thực hiện "ngẫu nhiên".

Vì vậy, nói rằng javadoc:

Nếu bất kỳ chủ đề đang chờ đợi trên đối tượng này, một trong số họ được chọn để được đánh thức. Sự lựa chọn là tùy ý và xảy ra theo quyết định của việc thực hiện.

Như vậy nó sẽ là lý thuyết có thể là một việc thực hiện JVM quyết định ban hành lệnh cụ thể; nhưng như được hiển thị - theo mặc định, bạn không thể mong đợi bất kỳ đơn đặt hàng nào. Vì vậy, bạn không nên viết mã dựa trên một thứ tự cụ thể như vậy hoặc.

0

Xem tài liệu cho phương thức notify().

Đánh thức một chuỗi đang chờ trên màn hình của đối tượng này. Nếu bất kỳ chủ đề nào đang chờ đối tượng này, một trong số chúng được chọn là đánh thức. Lựa chọn là tùy ý và xảy ra theo quyết định của việc triển khai .

Các vấn đề liên quan