Cơ chế ngắt luồng là cách ưa thích để một luồng (hợp tác) phản hồi yêu cầu dừng những gì nó đang làm. Bất kỳ luồng nào (bao gồm cả chính luồng mà tôi nghĩ) có thể gọi interrupt()
trên một Chủ đề.
Trong thực tế, các trường hợp sử dụng thông thường interrupt()
liên quan đến một số loại khuôn khổ hoặc trình quản lý yêu cầu một số luồng công nhân dừng những gì họ đang làm. Nếu luồng công nhân "nhận biết ngắt", nó sẽ thông báo rằng nó đã bị gián đoạn thông qua một ngoại lệ hoặc bằng cách kiểm tra định kỳ cờ bị ngắt của nó. Khi nhận thấy rằng nó đã bị gián đoạn, một chuỗi hoạt động tốt sẽ từ bỏ những gì nó đang làm và tự kết thúc.
Giả sử trường hợp sử dụng ở trên, mã của bạn có thể bị gián đoạn nếu nó được chạy trong khuôn khổ Java hoặc từ một chuỗi công nhân nào đó. Và khi nó bị gián đoạn, mã của bạn nên từ bỏ những gì nó đang làm và tự kết thúc bằng cách thích hợp nhất. Tùy thuộc vào cách mã của bạn được gọi, điều này có thể được thực hiện bằng cách trả về hoặc bằng cách ném một số ngoại lệ thích hợp. Nhưng nó có lẽ không nên gọi System.exit()
. (Ứng dụng của bạn không nhất thiết biết lý do tại sao nó bị gián đoạn và chắc chắn nó không biết liệu có các luồng khác cần bị gián đoạn bởi khuôn khổ hay không.)
Mặt khác, nếu mã của bạn không được thiết kế để chạy dưới sự kiểm soát của một số khuôn khổ, bạn có thể tranh luận rằng đó InterruptedException
là một ngoại lệ không mong muốn; tức là một con bọ. Trong trường hợp đó, bạn nên xử lý ngoại lệ như đối với các lỗi khác; ví dụ: bọc nó trong một ngoại lệ không được kiểm tra, và bắt và ghi lại nó vào cùng thời điểm bạn xử lý các ngoại lệ không được kiểm tra bất ngờ khác. (Ngoài ra, ứng dụng của bạn có thể đơn giản bỏ qua sự gián đoạn và tiếp tục làm những gì nó đang làm.)
1) Nếu tôi không bao giờ tự mình làm gián đoạn các chuỗi khác, điều gì có thể kích hoạt Ngoại lệ bị gián đoạn?
Một ví dụ là nếu các Runnable
đối tượng của bạn được thực thi bằng cách sử dụng ExecutorService
và shutdownNow()
được gọi trên dịch vụ. Và về lý thuyết, bất kỳ nhóm luồng hoặc khuôn khổ quản lý luồng nào của bên thứ 3 đều có thể làm điều gì đó như thế này một cách hợp pháp.
2) Nếu tôi không bao giờ tự mình ngắt các chuỗi khác bằng cách sử dụng ngắt () ... thì an InterruptedException
có nghĩa là gì? Tôi phải làm gì khi bắt được một con? Tắt ứng dụng của tôi?
Bạn cần phân tích cơ sở mã để tìm ra những gì đang thực hiện các interrupt()
cuộc gọi và tại sao. Khi bạn đã tìm ra điều đó, bạn có thể tìm ra những gì >> phần << ứng dụng của bạn cần làm.
Cho đến khi bạn biết lý do tại sao lại InterruptedException
bị ném, tôi khuyên bạn nên coi nó như một lỗi khó; ví dụ: in stacktrace vào tệp nhật ký và tắt ứng dụng. (Rõ ràng, đó không phải lúc nào cũng là câu trả lời đúng ... nhưng vấn đề là đây là "một lỗi", và nó cần được nhà phát triển / người bảo trì chú ý).
3) Làm cách nào để tìm ra ai / cái gì đang gọi interrupt()
?
Không có câu trả lời tốt cho điều này. Cách tốt nhất tôi có thể đề xuất là đặt một điểm ngắt trên Thread.interrupt()
và nhìn vào ngăn xếp cuộc gọi.