这个中断()是否必要?

时间:2015-10-22 07:16:01

标签: java multithreading

以下是片段:

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()是必要的吗?

1 个答案:

答案 0 :(得分:6)

是的,这是必要的。如果队列为空,则此语句String msg = queue.take();将阻塞,直到将一个元素放入队列或它被中断。

如果你想保证线程没有挂起,你需要打断它。

然而似乎有一个小故障:当你调用reservations方法并且队列为空时close不为0,似乎你的循环将继续并挂起{{1在中断后的while循环迭代中。