Lựa chọn mặc định chính xác là thêm InterruptedException vào danh sách ném của bạn. Một ngắt cho biết rằng một chủ đề khác muốn chủ đề của bạn kết thúc. Lý do cho yêu cầu này không được đưa ra rõ ràng và hoàn toàn theo ngữ cảnh, vì vậy nếu bạn không có thêm kiến thức nào, bạn nên cho rằng đó chỉ là tắt máy thân thiện và bất cứ điều gì tránh được việc tắt máy là phản ứng không thân thiện.
Java sẽ không ném ngẫu nhiên InterruptedException, mọi lời khuyên sẽ không ảnh hưởng đến ứng dụng của bạn nhưng tôi đã gặp phải trường hợp nhà phát triển theo chiến lược "nuốt" trở nên rất bất tiện. Một nhóm đã phát triển một loạt các thử nghiệm và sử dụng Thread.S ngủ rất nhiều. Bây giờ chúng tôi bắt đầu chạy thử nghiệm trong máy chủ CI của mình và đôi khi do lỗi trong mã sẽ bị kẹt trong chờ đợi vĩnh viễn. Để làm cho tình hình tồi tệ hơn, khi cố gắng hủy công việc CI, nó không bao giờ đóng vì Thread.Interrupt dự định hủy bỏ bài kiểm tra đã không hủy bỏ công việc. Chúng tôi đã phải đăng nhập vào hộp và tự hủy các quy trình.
Câu chuyện dài quá ngắn, nếu bạn chỉ cần ném Interrupttedception, bạn sẽ phù hợp với mục đích mặc định mà chủ đề của bạn sẽ kết thúc. Nếu bạn không thể thêm Interrupttedception vào danh sách ném của mình, tôi sẽ bọc nó trong RuntimeException.
Có một lập luận rất hợp lý được đưa ra rằng InterruptedException phải là một RuntimeException, vì điều đó sẽ khuyến khích việc xử lý "mặc định" tốt hơn. Đây không phải là RuntimeException chỉ vì các nhà thiết kế mắc kẹt với một quy tắc phân loại rằng RuntimeException sẽ thể hiện lỗi trong mã của bạn. Vì Interrupttedception không phát sinh trực tiếp từ một lỗi trong mã của bạn, nên không phải vậy. Nhưng thực tế là thường xảy ra Interrupttedception vì có lỗi trong mã của bạn, (tức là vòng lặp vô tận, khóa chết) và Interrupt là một phương thức khác của luồng để xử lý lỗi đó.
Nếu bạn biết có việc dọn dẹp hợp lý sẽ được thực hiện, thì hãy làm điều đó. Nếu bạn biết nguyên nhân sâu xa hơn của Ngắt, bạn có thể xử lý toàn diện hơn.
Vì vậy, tóm lại các lựa chọn của bạn để xử lý nên theo danh sách này:
- Theo mặc định, thêm để ném.
- Nếu không được phép thêm vào các cú ném, hãy ném RuntimeException (e). (Lựa chọn tốt nhất cho nhiều lựa chọn xấu)
- Chỉ khi bạn biết một nguyên nhân rõ ràng của Ngắt, hãy xử lý như mong muốn. Nếu việc xử lý của bạn là cục bộ đối với phương thức của bạn, thì thiết lập lại bị gián đoạn bởi một cuộc gọi đến Thread.cienThread (). Interrupt ().