关闭线程池shutdown方法
这一节我们来shoudown方法,该方法的作用是关闭现身池,一般我们用它的时候都是写在finally大模块中,
为什么要关闭现身池?如果线程池用完不关闭的话,程序就不会结束,但是你关闭它的话程序才会结束。
shoudown方法它有两个特点,
第一个特点是调用shoudown方法关闭线程池以后,线程池不再接收新任务。
第二个特点是他会继续执行完任务队列中的任务。
不再接收新任务
首先来看第一个特点,不再接收新任务,shoudown方法一旦调用线程池就会被关闭,
shoudown假如池中还有正在执行的任务,他们不会被中断,而是继续执行完。
此时如果有新任务提交的话,线程池根本不会理会,而且还会根据当时设置的任务拒绝策略来拒绝它。
下面我们来演示这一特点,编写一个任务task。每个任务都有一个任务编号,这样做的目的是方便观察任务执行情况,任务内容是输出当前线程名称和任务编号,接下来我们来执行该任务。
使用threadpoolexecutor创建线程池,核心线程数和最大线程数都是一,空闲线程存活时间是0秒,也就是不销毁空闲线程,任务队列采用的是linkedblockingqueue队列长度为一,只能存放一个任务任务,拒绝策略采用的是abortpolicy抛出拒绝执行异常。接着向线程池中提交一个任务任务编号为一使用try---catch捕获拒绝执行异常。写上finally大碗块,在finally大板块中调用shoudown方法关闭线程池池,关闭以后再提交一个任务任务编号为二,至此论方法编写完成,整个例子也编写完成。
执行程序观察执行结果,
从执行结果来看,程序输出一以后发生了拒绝执行异常,说明线程池在关闭后拒绝了任务2,符合预期。
继续执行完任务队列中的任务
看完了第一个特点,再来看第二个特点,继续执行完任务队列中的任务,假设任务队列中还有一个任务三没有执行,
他不会被抛弃,线程池会继续执行完,他直到任务队列中所有的任务都执行完,
限制池才会彻底的关闭。
下面我们来演示这一特点,还是沿用之前的例子,只不过需要在线程池关闭之前再提交一个任务任务编号为三,至此例子改写完成
再来执行程序看,看从执行结果来看,程序输出一和三还有拒绝执行异常,
说明线程池关闭以后,继续把任务队列中的三号任务执行完了,但第二个任务依然是被拒绝了,这次测试结果完全符合预期。
总结
最后总结一下本节内容,本节介绍了关闭现身池的方法,shoudown它的作用及用法,这里就不再赘述了,在实际开发中只要是用到线程池的地方,就会用到它本节的代码地址如下,大家如果有需要的话可以前去查看。
附录:
笔记完整文本:
这一节我们来shoudown下葬方法,该方法的作用是关闭现身池,一般我们用它的时候都是写在finally大模块中,为什么要关闭现身池?如果线程池用完不关闭的话,程序就不会结束,但是你关闭它的话程序才会结束。shoudown方法它有两个特点,第一个特点是调用下档方法关闭线程池以后,线程池不再接收新任务。第二个特点是他会继续执行完任务,队列中的任务。首先来看第一个特点,不再接收新任务,下档方法一旦调用线程池就会被关闭,假如池中还有正在执行的任务,他们不会被中断,而是继续执行完。此时如果有新任务提交的话,线程池根本不会理会,而且还会根据当时设置的任务拒绝策略来拒绝它。 下面我们来演示这一特点,编写一个任务task。每个任务都有一个任务编号,这样做的目的是方便观察任务执行情况,任务内容是输出当前线程名称和任务编号,接下来我们来执行该任务。使用threadpoolexecutor创建线程池,核心线程数和最大线程数都是一,空闲线程存活时间是0秒,也就是不销毁空闲线程,任务队列采用的是linkedblockingqueue队列长度为一,只能存放一个任务任务,拒绝策略采用的是abortpolicy抛出拒绝执行异常。接着向线程池中提交一个任务任务编号为一使用try---catch捕获拒绝执行异常。写上finally大碗块,在finally大板块中调用shoudown方法关闭线程池池,关闭以后再提交一个任务任务编号为二,至此论方法编写完成,整个例子也编写完成。 执行程序观察执行结果,从执行结果来看,程序输出一以后发生了拒绝执行异常,说明线程池在关闭后拒绝了任务2,符合预期。看完了第一个特点,再来看第二个特点,继续执行完任务队列中的任务,假设任务队列中还有一个任务三没有执行,他不会被抛弃,线程池会继续执行完,他直到任务队列中所有的任务都执行完,限制池才会彻底的关闭。下面我们来演示这一特点,还是沿用之前的例子,只不过需要在线程池关闭之前再提交一个任务任务编号为三,至此例子改写完成。再来执行程序看,看从执行结果来看,程序输出一和三还有拒绝执行异常,说明线程池关闭以后,继续把任务队列中的三号任务执行完了,但第二个任务依然是被拒绝了,这次测试结果完全符合预期。 最后总结一下本节内容,本节介绍了关闭现身池的方法,shoudown它的作用及用法,这里就不再赘述了,在实际开发中只要是用到线程池的地方,就会用到它本节的代码地址如下,大家如果有需要的话可以前去查看。