在 Java
中和关闭线程池相关的方法主要有以下:java
void shutdown()
List<Runnable> shutDownNow
boolean awaitTermination
boolean isShutDown
boolean isTerminated
shutDown
方法从字面意思咱们能够看到是中止关闭的意思,咱们先来看下面的一段代码,首先咱们经过 ThreadPoolExecutor
来建立一个容量是10的无界线程池,与 FixedThreadPool
相似的,这里手动建立能够更好地理解线程池的建立。在后咱们提交一千个任务执行,再执行 shutdown
方法进行暂停。public static void main(String[] args) throws InterruptedException { ExecutorService service = new ThreadPoolExecutor( 10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); for (int i = 0; i < 1000; i++) { service.submit(() ->{ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { System.out.println("接受中断,不处理~~"); } System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName()); }); } service.shutdown(); }
ShutDown
而言它能够安全的中止一个线程池,它有几个关键点ShutDown
会首先将线程设置成 SHUTDOWN
状态,而后中断全部没有正在运行的线程shutDown
方法其实就是要等待全部任务正常所有结束之后才会关闭线程池shutdown()
方法后若是还有新的任务被提交,线程池则会根据拒绝策略直接拒绝后续新提交的任务。now
,即当即中止任务,public static void main(String[] args) throws InterruptedException { ExecutorService service = new ThreadPoolExecutor( 10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(1000)); for (int i = 0; i < 1000; i++) { service.submit(() ->{ try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { System.out.println("接受中断,结束线程~~"); //这里响应中断 return; } System.out.println("args = " + Arrays.deepToString(args)+ Thread.currentThread().getName()); }); } final List<Runnable> runnables = service.shutdownNow(); System.out.println(runnables); }
shutDownNow
方法后,会像所有正在运行的队列通知中断,正在运行的线程接收到中断信号后选择处理,而在队列中的所有取消执行转移到一个list
队列中返回,如上述 List<Runnable> runnables
,这里记录了全部终止的线程boolean awaitTermination_(_long timeout, TimeUnit unit_)_
timeout
表示等待的时间,unit
时间单位timeout
时间后,反馈线程池的状态,true
;false
;isShutDown
方法正如名字,判断线程池是否中止,返回的是 Boolean
类型,若是已经开始中止线程池则返回 true
不然放回falseshutDown
或shutDownNow
时以后,会返回 true
不过须要注意,这时候只是表明线程池关闭流程的开始,并非说线程池已经中止了shutdown
方法以后,线程池会继续执行里面未完成的任务,包括正在执行的任务和在任务队列中等待的任务。shutdown
方法,可是有一个线程依然在执行任务,那么此时调用 isShutdown
方法返回的是 true
,而调用 isTerminated
方法返回的即是 false
,由于线程池中还有任务正在在被执行,线程池并无真正“终结”。isTerminated()
方法才会返回 true
,这表示线程池已关闭而且线程池内部是空的,全部剩余的任务都执行完毕了。本文由AnonyStar 发布,可转载但需声明原文出处。
欢迎关注微信公帐号 :云栖简码 获取更多优质文章
更多文章关注笔者博客 : 云栖简码 i-code.online