以下是片段:
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();
}
}
}
}
正如上面的代码,即使我们在stop()方法中放入 LoggerThread.interrupt(),中断也只是被线程捕获而且什么都不做。
那么 LoggerThread.interrupt()是必要的吗?
答案 0 :(得分:6)
是的,这是必要的。如果队列为空,则此语句String msg = queue.take();
将阻塞,直到将一个元素放入队列或它被中断。
如果你想保证线程没有挂起,你需要打断它。
然而似乎有一个小故障:当你调用reservations
方法并且队列为空时close
不为0,似乎你的循环将继续并挂起{{1在中断后的while循环迭代中。