为了账号安全,请及时绑定邮箱和手机立即绑定

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。





正在回答

1 回答

问题还是回到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;

    }


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
深入浅出Java多线程
  • 参与学习       186085    人
  • 解答问题       464    个

带你一起深入浅出多线程,掌握基础,展望进阶路线

进入课程

sleep()使用问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信