JAVA线程池shutdown和shutdownNow的区别

2024-11-28 14:38:12
推荐回答(1个)
回答(1):

shutDown()当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。shutdownNow()根据JDK文档描述,大渣拆致意思是:执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep、wait、Condition、定时锁等应用,interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。上面对shutDown()以及shutDownNow()作了一个简单的、理论上的分析。如果想知道why,则需要亲自打开JDK源码,分析分析。想要分析shutDown()以及shutDownNow()源码,我建议首先要对ThreadPoolExecutor有个大概了解。因为关闭线程池的所有方法逻辑都在ThreadPoolExecutor中处理的。如果你真的想知道为什么,建议看一下我以前写的一篇对ThreadPoolExecutor源码分析的博文,我想这对如迹枣你比较透彻的了解shutDown()和shutDownNow()的区别以及java线程池原理有很大的帮助。废话少说,要查看源码,首先进入ThreadPoolExecutor的shutDown()方法:Java代码收藏代码publicvoidshutdown(){SecurityManagersecurity=System.getSecurityManager();if(security!=null)security.checkPermission(shutdownPerm);finalReentrantLockmainLock=this.mainLock;mainLock.lock();try{if(security!=null){//州培Checkifcallercanmodifyourthreadsfor(Workerw:workers)security.checkAccess(w.thread);}intstate=runState;if(state