问答详情
源自:3-3 Java线程停止广为流传的错误方法---interrupt方法

sleep()使用问题

感谢你无私的奉献,让我了解到为什么不用不用stop(),推荐的标志的方式。

我也想再问一句:为什么不使用sleep()呢。

  1.我可以在方法中捕捉InterruptedException 时候 处理异常并且用ruturn;


  2.我看到官方自带的线程池Exceutor中的shutdownNow也是使用 interrupte()的如下:

java.util.concurrent.ThreadPoolExecutor中的

 private void interruptWorkers() {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            for (Worker w : workers) {
                try {
                    w.thread.interrupt();
                } catch (SecurityException ignore) {
                }
            }
        } finally {
            mainLock.unlock();
        }
    }

我看到网上是说 interrupte()不能中断IO。





提问者:留一阵风 2015-01-07 23:12

个回答

  • Arthur
    2015-01-08 13:22:14

    问题还是回到interrupte()方法的初衷,这个方法是用来向线程发出中断请求,而非停止线程的。当然很多时候要停止线程就需要先给他一个中断请求,然后让线程处理中断(比如处理InterruptedException)。


    在你提到的shutdownNow中,我们看到调用interruptWorkers()也是这个意思,让所有的worker线程有机会处理中断。紧接着,tryTerminate()回去做停止的工作。


    public List<Runnable> shutdownNow() {

            List<Runnable> tasks;

            final ReentrantLock mainLock = this.mainLock;

            mainLock.lock();

            try {

                checkShutdownAccess();

                advanceRunState(STOP);

                interruptWorkers();

                tasks = drainQueue();

            } finally {

                mainLock.unlock();

            }

            tryTerminate();

            return tasks;

        }