博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程池ShutDown和ShowDownNow区别
阅读量:4210 次
发布时间:2019-05-26

本文共 2498 字,大约阅读时间需要 8 分钟。

在写上一篇文章的时候就在想,executor.shutDown会不会把正在执行中的任务给中断了?虽然当时也分析过,但是当时确实只是泛泛而读,在实际中还是相当的模糊。借此机会,我们再复习一下。

public void shutdown() {        final ReentrantLock mainLock = this.mainLock;        mainLock.lock();        try {            checkShutdownAccess();            //将线程池状态设置为shutdown            advanceRunState(SHUTDOWN);            //中断线程池中的worker线程            interruptIdleWorkers();            onShutdown(); // hook for ScheduledThreadPoolExecutor        } finally {            mainLock.unlock();        }        tryTerminate();    }

那么中断线程的操作就在这个interruptIdleWorkers()中。

private void interruptIdleWorkers(boolean onlyOne) {        final ReentrantLock mainLock = this.mainLock;        mainLock.lock();        try {            for (Worker w : workers) {                Thread t = w.thread;                //这里的tryLock是尝试获取工作线程的锁,如果工作线程在运行                //那么就获取不到锁,也就是无法中断。所以这里中断的都是没有运行的线程                if (!t.isInterrupted() && w.tryLock()) {                    try {                        //调用每个线程的中断                        t.interrupt();                    } catch (SecurityException ignore) {                    } finally {                        w.unlock();                    }                }                if (onlyOne)                    break;            }        } finally {            mainLock.unlock();        }    }

所以说shutdown是不会让线程直接退出的,之前添加的线程还是会运行到自然结束。但是因为这块设置了线程池状态为shutdown,因此线程是添加不了的。

而在shutdownNow方法中

public List
shutdownNow() { List
tasks; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess(); //直接设置为stop状态 advanceRunState(STOP);            //中断线程 interruptWorkers(); tasks = drainQueue(); } finally { mainLock.unlock(); } tryTerminate(); return tasks; }
private void interruptWorkers() {        final ReentrantLock mainLock = this.mainLock;        mainLock.lock();        try {            for (Worker w : workers)               //逐个进行中断                w.interruptIfStarted();        } finally {            mainLock.unlock();        }    }
void interruptIfStarted() {            Thread t;            if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {                try {                //直接调用中断                    t.interrupt();                } catch (SecurityException ignore) {                }            }        }

所以看的出来,ShutDownNow是直接中断所有的工作线程。并且阻止新线程的添加。

转载地址:http://iqkmi.baihongyu.com/

你可能感兴趣的文章
Android (Linux) Suspend流程
查看>>
LINUX时间管理
查看>>
定时器的使用
查看>>
为Android加入busybox工具
查看>>
使用技巧busybox
查看>>
如何查看与/dev/input目录下的event对应的设备
查看>>
Linux系统时间与RTC时间
查看>>
TF卡和SD卡理解
查看>>
在 Java 中应用设计模式 - Factory Method .
查看>>
Linux Kernel Boot CMDLINE Processing
查看>>
字符杂项设备(miscdevice)
查看>>
bootloader-bootable解析
查看>>
bootloader (LK)&&android lk bootloader中相关修改指南
查看>>
SD卡驱动分析--基于高通平台
查看>>
SD Card 驱动流程分析
查看>>
Linux之debugfs介绍
查看>>
Linux DebugFS 子目录也是用debugfs_create_dir来实现
查看>>
关于sd卡中一些概念的理解
查看>>
SD卡图形介绍
查看>>
linux MISC 驱动模型分析
查看>>