2011-11-09 36 views
5

Xem xét thực tế là wait() chỉ có thể được gọi trong một bối cảnh đồng bộ mà sau đó phát hành màn hình cho đến khi một thông báo/nofityAll đã được gọi trên cùng một đối tượng bằng một chủ đề khác,điều gì sẽ xảy ra khi một chuỗi bị gián đoạn trong khi chặn trên một wait()?

Giả sử Chủ đề A đang chặn() mà kết quả trong Chủ đề B có được khóa. Bây giờ nếu chúng ta ngắt đoạn A, điều khiển sẽ được chuyển ngay lập tức sang luồng A không? trong trường hợp này, vì khối try catch xử lý InterrupException nằm trong bối cảnh đồng bộ, và vì chỉ có một Thread có thể giữ màn hình tại một thời điểm, điều gì sẽ xảy ra với Thread B? nó có nên chuyển sang trạng thái bị chặn cho đến khi Thread A đã hoàn thành việc thực thi không?

Cảm ơn trước Advance

Trả lời

8

Đọc tài liệu hướng dẫn thực hiện trong thực tế giúp đỡ:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

Vì vậy, khi sợi chỉ bị gián đoạn, nó có để lại có được màn hình của đối tượng để khôi phục lại trạng thái đồng bộ hóa trước khi ngoại lệ được ném. Các khoản giữ tương tự để trả lại từ cuộc gọi chờ (dài) sau khi khoảng thời gian đã chỉ định đã trôi qua.

Chuỗi T sau đó được xóa khỏi bộ chờ cho đối tượng này và bật lại để lập lịch trình chuỗi. Sau đó nó cạnh tranh theo cách thông thường với các chủ đề khác cho quyền đồng bộ hóa trên đối tượng; một khi nó đã giành quyền kiểm soát đối tượng, tất cả các yêu cầu đồng bộ hóa của nó trên đối tượng được khôi phục lại trạng thái ante - tức là, với tình huống tính đến thời điểm phương thức chờ được gọi. Chủ đề T sau đó trả về từ lời gọi phương thức chờ. Do đó, khi trả về từ phương thức chờ, trạng thái đồng bộ của đối tượng và của chuỗi T chính xác như khi phương thức chờ được gọi.

Nếu chuỗi hiện tại bị gián đoạn bởi một luồng khác trong khi chờ đợi là , thì khi đó ngắt InterruptedException sẽ bị hủy. Ngoại lệ này không phải là bị ném cho đến khi trạng thái khóa của đối tượng này được khôi phục thành được mô tả ở trên.

+0

+1. Tôi đã tìm kiếm trong tài liệu để chờ() (không có đối số), và nó không được đề cập (và không có liên kết đến phương thức chờ quá tải). Quá tệ. –

+0

ah! tôi không thấy lời giải thích trong java 6 doc http://bit.ly/tNJ1VT. anyway, trong trường hợp đó tôi đoán Chủ đề A PHẢI kiểm tra lại tình trạng điều kiện khi nhận được Ngoại lệ trước khi tiếp tục thêm bất kỳ –

+0

@arun_suresh: Như tôi đã nói, đó là trong thời gian chờ (long) javadoc: http://download.oracle.com/javase /6/docs/api/java/lang/Object.html#wait%28long%29. Một ngắt thường được sử dụng để làm cho một thread dừng lại. Vì vậy, bạn thường không tiến hành thêm nữa. –

2

Tôi tin rằng A sẽ trở thành runnable nhưng sẽ đợi cho đến khi nó có thể lấy khóa trước khi tiếp tục điều khoản bắt. Nó sẽ không ép B vào trạng thái bị chặn. Toàn bộ điểm của khối được đồng bộ hóa là chủ đề giữ khóa được đảm bảo rằng không có luồng nào khác có thể đồng bộ hóa trên cùng một khóa cho đến khi nó khóa khóa; buộc B vào trạng thái bị chặn và để cho A phản ứng lại khóa sẽ vi phạm chính bản chất của đồng bộ hóa.

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