Sau đây là đoạn:Đây có phải là ngắt() cần thiết không?
public class LogService {
public void stop() {
synchronized (this) { isShutdown = true; }
loggerThread.interrupt(); /* Is it necesarry? */
}
public void log(String msg) throws InterruptedException {
synchronized (this) {
if (isShutdown)
throw new IllegalStateException(...);
++reservations;
}
queue.put(msg);
}
private class LoggerThread extends Thread {
public void run() {
try {
while (true) {
try {
synchronized (LogService.this) {
if (isShutdown && reservations == 0)
break;
}
String msg = queue.take();
synchronized (LogService.this) {
--reservations;
}
writer.println(msg);
} catch (InterruptedException e) { } /* Do nothing */
}
} finally {
writer.close();
}
}
}
}
Như đoạn code trên, Thậm chí nếu chúng ta đặt LoggerThread.interrupt() trong stop() phương pháp, sự gián đoạn chỉ được đánh bắt bởi thread và không làm gì cả.
Vì vậy, là LoggerThread.interrupt() cần thiết?
Xóa câu trả lời của tôi là câu trả lời chính xác hơn. –
Vì vậy, 'InterruptedException' có thể được chuyển tới' queue.take() '? – user2916610
@ user2916610 ngoại lệ không được chuyển cho phương thức - mã trong 'queue.take()' kiểm tra xem luồng có bị gián đoạn một cách thường xuyên và ném ra một InterruptedException nếu luồng bị gián đoạn hay không. – assylias