接上一章,本文主要对shutdown()、shutdownNow()、awaitTerminate(long timeout,TimeUnit unit)这三个方法采用问答的形式分别进行讲解。本文实验基于JDK版本1.8。

1、shutdown()

:shutdown()有什么功能?

:阻止新来的任务提交,对已经提交了的任务不会产生任何影响。当已经提交的任务执行完后,它会将那些闲置的线程(idleWorks)进行中断,这个过程是异步的。

:如何阻止新来的任务提交?

:通过将线程池的状态改成SHUTDOWN,当再将执行execute提交任务时,如果测试到状态不为RUNNING,则抛出rejectedExecution,从而达到阻止新任务提交的目的。

:为何对提交的任务不产生任何影响?

:在调用中断任务的方法时,它会检测workers中的任务,如果worker对应的任务没有中断,并且是空闲线程,它才会去中断。另外的话,workQueue中的值,还是按照一定的逻辑顺序不断的往works中进行输送的,这样一来,就可以保证提交的任务按照线程本身的逻辑执行,不受到影响。

 

2、shutdownNow()

:shutdownNow()有什么功能?

:阻止新来的任务提交,同时会中断当前正在运行的线程,即workers中的线程。另外它还将workQueue中的任务给移除,并将这些任务添加到列表中进行返回。

:如何阻止新来的任务提交?

:通过将线程池的状态改成STOP,当再将执行execute提交任务时,如果测试到状态不为RUNNING,则抛出rejectedExecution,从而达到阻止新任务提交的目的.

:如果我提交的任务代码块中,正在等待某个资源,而这个资源没到,但此时执行shutdownNow(),会出现什么情况?

:当执行shutdownNow()方法时,如遇已经激活的任务,并且处于阻塞状态时,shutdownNow()会执行1次中断阻塞的操作,此时对应的线程报InterruptedException,如果后续还要等待某个资源,则按正常逻辑等待某个资源的到达。例如,一个线程正在sleep状态中,此时执行shutdownNow(),它向该线程发起interrupt()请求,而sleep()方法遇到有interrupt()请求时,会抛出InterruptedException(),并继续往下执行。在这里要提醒注意的是,在激活的任务中,如果有多个sleep(),该方法只会中断第一个sleep(),而后面的仍然按照正常的执行逻辑进行。

 

3、awaitTermination(long timeout,TimeUnit unit)

简单来说,awaitTermination会一直等待,直到线程池状态为TERMINATED或者,等待的时间到达了指定的时间。

 

4、补充

//runState != RUNNING
System.out.println("-----isShutdown-------:"+tpe.isShutdown());
//state == SHUTDOWN || state == STOP
System.out.println("-----isTerminating----:"+tpe.isTerminating());
//runState == TERMINATED
System.out.println("-----isTerminated-----:"+tpe.isTerminated());

 

posted on 2014-09-23 18:42  天狼群星  阅读(14869)  评论(0编辑  收藏  举报