发现-时光导航网 发现-时光导航网

全家福,嘴唇干裂,80电影天堂-发现-时光导航网

难度

初级

学习时刻

30分钟

适宜人群

零根底

开发言语

Java

开发环境

  • JDK v11
  • IntelliJIDEA v2018.3

友谊提示

  • 本教育归于系列教育,内容具有连贯性,本章运用到的内容之前教育中都有详细解说。
  • 本章内容针对零根底或根底较差的同学比较友爱,或许关于有根底的同学来说很简单,期望咱们能够依据自己的实际状况挑选继续看完或等候看下一篇文章。谢谢咱们的体谅!

1.温故知新

前面在《“全栈2019”Java线程进阶第四章:线程池中默许的线程工厂》一章中介绍了线程池中默许的线程工厂

《“全栈2019”Java线程进阶第五章:提交使命execute(Runnable r)》一章中介绍了向线程池提交使命execute(Runnable r)

《“全栈2019”Java线程进阶第六章:提交使命submit(Runnable r)》一章中介绍了向线程池提交使命submit(Runnable task)

《“全栈2019”Java线程进阶第七章:提交使命submit(Runnable r,T)》一章中介绍了向线程池提交使命submit(Runnable task, T result)

《“全栈2019”Java线程进阶第八章:提交使命submit(Callable c)》一章中介绍了向线程池提交使命submit(Callable task)

本章介绍封闭线程池shutdown()

2.封闭线程池

之前介绍过怎么创立线程池以及怎么向线程池提交使命。

本章介绍怎么封闭线程池。

还记住在第一章《“全栈2019”Java线程进阶第一章:什么是线程池?》中说到为什么需求线程池,正是由于线程的创立和毁掉是一个很绵长的进程,并且大都线程被创立出来只运用过一次就被丢掉,被丢掉的线程第一时刻也没有及时被整理的,还存在于内存中,占用着资源,所以,为了处理此类状况,就需求创立一批线程将其循环运用起来,线程池技能再适宜不过了。

同理,咱们的线程池假如得不到稳当的运用和办理,那么本应是一把利器也变成了拖垮程序的钝器。

当咱们运用完线程池时,应该将其封闭。

封闭线程池的优点是及时开释线程池占用的资源。

假如程序中只剩下履行过使命的线程池,并且该线程池未封闭,程序是不会结束的,由于线程池中的线程还在等候咱们向它提交使命,此刻线程池中的线程是阻塞状态。

下面,咱们来看看怎么运用shutdown()办法。

3.封闭线程池shutdown()办法

shutdown()办法:

shutdown()办法的作用是封闭线程池。从前提交的使命仍旧会被正常履行,后续不再接纳新的使命。

反常

throws SecurityException:假如没有权限履行此操作。

示例

下面演示shutdown()办法。

首要,需求清晰给线程池需求提交的使命(Runnable或Callable):

然后,创立履行使命的线程池:

接着,运用submit(Runnable task)办法提交Runnable使命:

最终,封闭线程池:

比如书写结束。

运转程序,履行成果:

从运转成果来看,契合预期。

咱们能够很清楚地看到,线程池在履行完使命今后被封闭。

注意事项

在运用完线程池后一定要记住封闭线程池!

4.刚创立的线程池一次使命都没履行需求调用shutdown()办法封闭吗?

这儿咱们来试一下。

创立一个线程池:

然后,什么也不履行。

运转程序,履行成果:

从运转成果来看,刚创立且一次使命也没履行的线程池无需调用shutdown()办法封闭。

这种状况和咱们把线程创立出来然后不发动它相同。

5.被shutdown()办法封闭的线程池之前现已提交的使命还会被履行吗?

会。

下面来进行验证。

为了验证这个问题,咱们创立一个固定巨细为5的线程池,然后向其提交10个Runnable使命,每个Runnable使命都相同,里边都使当时履行使命的线程睡3秒钟,这样的话,必定有使命被积压在使命行列,与此同时,咱们调用shutdown()办法封闭线程池,调查线程池会不会继续履行完正在履行的使命和积压在使命行列中还未履行的使命。

首要,创立需求提交给线程池的Runnable使命,如上所述Runnable使命里边使当时履行使命的线程睡3秒钟,然后打印其线程称号:

然后,如上所述,创立固定巨细为5的线程池:

接着,如上所述,向线程池中提交10个Runnable使命:

紧接着,调用shutdown()办法封闭线程池:

为了证明封闭线程池这个操作是马上履行的,咱们在该操作后边输出一句话:

比如书写结束。

运转程序,履行成果:

从运转成果来看,契合预期。

事实证明,被shutdown()办法封闭的线程池仍旧会将从前提交的使命履行结束

6.被shutdown()办法封闭的线程池后续还会接纳新提交的使命吗?

不会。

下面进行验证。

为了验证这个问题,咱们在上一末节的根底上,接着后边写,只需再提交新使命即可:

比如改写结束。

运转程序,履行成果:

从运转成果来看,契合预期。

程序发作RejectedExecutionException:

该反常只要在线程池回绝使命的时分才会发作,为什么此次会发作RejectedExecutionException呢?

由于线程池现已封闭了,不再接纳提交的新使命,所以发作了RejectedExecutionException。

事实证明,被shutdown()办法封闭的线程池后续不会接纳新提交的使命

7.怎么判别线程池是否现已被shutdown?

咱们能够经过isShutdown()办法来判别线程池是否现已被shutdown

详细运用办法如下。

经过改写上一末节比如来演示isShutdown()办法。

在提交新使命前能够先判别线程池是否现已被shutdown:

比如改写结束。

运转程序,履行成果:

从运转成果来看,契合预期。

本来程序会出现反常,现在经过isShutdown()办法判别线程池是否被封闭来防止线程池在已封闭的状况下还继续提交新使命

最终,期望咱们能够把这个比如照着写一遍,然后再自己默写一遍,便利今后碰到相似的面试题能够轻松应对。

祝咱们编码愉快!

GitHub

本章程序GitHub地址:https://github.com/gorhaf/Java2019/tree/master/Thread/ThreadPool/ExecutorService

总结

  • shutdown()办法的作用是封闭线程池。从前提交的使命仍旧会被正常履行,后续不再接纳新的使命。
  • 刚创立且一次使命也没履行的线程池无需调用shutdown()办法封闭。
  • 假如程序中只剩下履行过使命的线程池,并且该线程池未封闭,程序是不会结束的,由于线程池中的线程还在等候咱们向它提交使命,此刻线程池中的线程是阻塞状态。
  • 被shutdown()办法封闭的线程池仍旧会将从前提交的使命履行结束。
  • 被shutdown()办法封闭的线程池后续不会接纳新提交的使命。
  • 经过isShutdown()办法判别线程池是否被封闭来防止线程池在已封闭的状况下还继续提交新使命。

至此,Java中封闭线程池shutdown()相关内容解说先告一段落,更多内容请继续重视。

答疑

假如咱们有问题或想了解更多前沿技能,请在下方留言或谈论,我会为咱们回答。

上一章

“全栈2019”Java线程进阶第八章:提交使命submit(Callable c)

下一章

“全栈2019”Java线程进阶第十章:封闭线程池shutdownNow()

学习小组

参加同步学习小组,一同沟通与前进。

方法一:欢迎参加“全栈工程师”编程圈子,与到圈友一同沟通评论。

(此处已增加圈子卡片,请到今天头条客户端检查)

方法二:重视头条号Gorhaf,私信“Java学习小组”。

方法三:重视大众号Gorhaf,回复“Java学习小组”。

全栈工程师学习方案

重视咱们,参加“全栈工程师学习方案”。

版权声明

原创不易,未经答应不得转载!

作者:admin 分类:国内时事 浏览:262 评论:0