Về cơ bản, bạn không tìm kiếm sự khác biệt về sách văn bản nhưng khác biệt trong trường hợp sử dụng của chúng.
Như folks đã đã chỉ ra, thức dậy thread không phải là hậu quả duy nhất nhưng gọi t1.interrupt()
từ Chủ đề t2
cho t1
sẽ gây ra một InterruptedException
trong chủ đề t1 và đó là một sự khác biệt lớn giữa Object.notify()
và Thread.interrupt()
.
Bạn nên hiểu rằng phương pháp của nó Object.wait()
mà ném kiểm tra InterruptedException
và buộc bạn phải xử lý nó. Object.wait.
Ngắt gián đoạn - nếu bất kỳ chủ đề nào bị gián đoạn luồng hiện tại trước hoặc trong khi luồng hiện tại đang chờ thông báo. Trạng thái bị gián đoạn của chuỗi hiện tại sẽ bị xóa khi trường hợp ngoại lệ này bị ném.
Sau đó, bạn nên tham khảo this question để có ý tưởng về cách xử lý ngoại lệ này.
Sự khác biệt giữa hai điều này nằm trong thực tế là giao tiếp giữa các luồng cho các công cụ lập trình logic thông thường (chờ & thông báo) và một (ngắt) khác là hủy bỏ/chấm dứt chuỗi ngay cả trong trường hợp chặn hoạt động. Bạn phải lưu ý rằng Java không cung cấp bất kỳ cơ chế nào để hủy trước một chuỗi để bạn phải sử dụng cơ chế ngắt cho mục đích đó (Rõ ràng, nếu cần thiết trong trường hợp của bạn), bạn có thể bỏ qua ngoại lệ này nếu không áp dụng trong trường hợp).
Java không hạn chế hành động của bạn sau InterruptedException
và bạn có thể làm bất cứ điều gì bạn muốn nhưng sử dụng nó cho những thứ khác ngoài việc thực hiện Chính sách hủy bỏ chủ đề không được thông báo. Chính sách hủy bỏ chủ đề thường bị bỏ qua và ít được thảo luận hơn khi các lập trình viên viết các chương trình đa luồng và đó là lý do tại sao bạn có thể thấy khó hiểu được trường hợp sử dụng.
Phương thức API như BlockingQueue.put(..) đang cố gắng cho bạn biết bằng cách ném InterruptedException
là ngay cả khi hoạt động chặn của nó cũng có thể bị chấm dứt trước. Không cần thiết rằng tất cả các phương pháp chặn API sẽ cung cấp cho bạn cơ sở đó.
Hủy/chấm dứt chuỗi bằng cách sử dụng Thread.interrupt()
không phải là một cơ chế mạnh mẽ nhưng hợp tác và chỉ là yêu cầu không phải là đơn hàng.
Việc sử dụng e.printStackTrace();
của bạn không được khuyến khích vì đây thường không phải là lỗi, nếu có ý định đăng nhập dưới dạng lỗi.
Hy vọng điều đó sẽ hữu ích !!
Nguồn
2017-01-29 13:56:55
[Tài liệu 'Thread'] (http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html) và [' Object' documentation] (http: // docs. oracle.com/javase/8/docs/api/java/lang/Object.html). –
Một nguyên nhân là một ngoại lệ, trường hợp khác gây ra sự trở lại. Một thông báo cho một đối tượng, cái kia ngắt một luồng. Một là quả táo, quả còn lại là quả cam. – EJP
Thức dậy không phải là hậu quả duy nhất, như bạn sẽ thấy trong tài liệu. –