Có, bạn cần phải lo lắng về InterruptedException
, cũng giống như bạn cần phải lo lắng về bất kỳ ngoại lệ đã kiểm tra nào khác mà bạn phải ném hoặc xử lý.
Hầu hết các lần InterruptedException
báo hiệu yêu cầu dừng, rất có thể do thực tế là chuỗi đang chạy mã của bạn là interrupted.
Trong tình huống cụ thể của hồ bơi kết nối đang chờ kết nối, tôi cho rằng đây là vấn đề hủy và bạn cần hủy bỏ việc thu thập, dọn dẹp và khôi phục cờ bị gián đoạn (xem bên dưới).
Ví dụ, nếu bạn đang sử dụng một số loại Runnable
/Callable
chạy bên trong một Executor
thì bạn cần phải xử lý các InterruptedException đúng:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
continue; //blah
}
pingRemoteServer();
}
}
});
Điều này có nghĩa rằng nhiệm vụ của bạn không bao giờ tuân theo cơ chế gián đoạn được sử dụng bởi người thực thi và không cho phép hủy/tắt máy đúng cách.
Thay vào đó, các thành ngữ thích hợp là để khôi phục lại tình trạng gián đoạn và sau đó dừng thực hiện:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // restore interrupted status
break;
}
pingRemoteServer();
}
}
});
nguồn lực hữu ích:
Nguồn
2009-06-21 20:48:55
Tuyệt đối. Để biết thêm thông tin, hãy xem bản tin Chuyên gia Java http://www.javaspecialists.co.za/archive/Issue056.html –
Không nên là Thread.currentThread(). Interrupt() thay vì Thread.interrupted()? Theo javadocs, Thread.interrupted() sẽ xóa cờ bị gián đoạn, không đặt nó. –
@Joe: bạn nói đúng, tôi đã sửa lại ví dụ. Cảm ơn bạn. –