ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

9.shoudown和shoudownnow的区别

2022-03-28 16:34:53  阅读:124  来源: 互联网

标签:区别 shoudown 任务 线程 关闭 shoudownnow 执行


 

 

shutdown 与 shutdownNow 的区别

 

 

 

 

今天介绍另一个关闭线程池的方法shoudownnow,本节内容有三个小节,第一小节介绍下shoudownnow,第二小节演示一个停不下来的任务。第三小节介绍shoudown与shoudownnow的区别。

介绍下shoudownnow

首先来看第一小节,shoudownnow方法的作用是关闭线程时不再接受新任务,并且尝试停止正在执行的任务。返回任务对应中未执行的任务还是以历史的集合形式返回的,

 

 

shoudownnow是如何停止任务的呢?来到他的方法内部,我们可以看到它是通过interruptworks方法,

 

 

来中断线程池中所有的线程。在interrupt的works的方法内部,再中断所有已经开始工作的线程,

 

 

具体的做法是调用线程的interrupt的方法给线程发送中断指令,

 

 

对于无限循环的任务来说,不响应线程中断指令,就意味着任务停不下来,这个例子待会会在第二小节中演示。

 

关于使用shoudownnow方法。

 

 

我们需要注意一点的是我们不能像使用shoudown那样使用shoudownnow。

 

 

shoudownnow只有在需要立即关闭线程池的时候使用,

 

 

日常开发中一般首选shoudown来关闭线程值,接下来动画演示下shoudownnow执行过程。

第二小节演示一个停不下来的任务。

这是一个正在运行的线程池。

 

 

当我们使用shoudownnow关闭它时,线程池就立即停止所有正在执行的任务,

 

 

 

 

 

 

并且当我们向线程池中提交新任务时,

 

 

还会以当时设定的任务拒绝策略来处理该任务,再将任务队列中还会执行的任务返回给调用者,

 

 

调用者拿到这些未执行的任务后可自行处理。

 

 

下面我们来演示下shoudownnow方法,编写一个任务task,任务内容是输出当前线的名称和任务编号,接下来我们来执行该任务。 


首先创建一个线程池,这里就以单个线程的线程池为例,然后向线程池中提交三个任务,三个任务的编号分别是123接着调用shoudownnow方法关闭线程池,接收shoudownnow方法返回值。遍历刚刚返回的任务列表,调用每个任务的run方法将他们执行完。

 

 

至此论方法编写完成,整个例子也编写完成执行程序,观察执行结果。从执行结果来看,一号任务是线程池执行的,二号和三号两个任务是main线程执行的,说明二号和三号两个任务是线程时关闭以后返回给调用者的,再由调用者线程执行。 

 

 停不下来的任务

 

介绍完下当的方法,再来看一个特别的任务。停不下来的任务。

修改任务代码,将输出的内容使用for循环无限输出,看看任务是否能够停下来,任务代码修改完毕

 

 

执行任务的代码还是沿用之前的,不需要提交那么多任务,只需提交一个任务即可,执行任务的代码也修改完毕,再执行程序看看从执行结果来看,

 

 

线程池虽然已经关闭,但任务还未结束,

 

 

针对这种情况,加入响应中断现成的代码就可以解决。使用if判断线程是否被中断,当线程被中断时,直接return

 

 

 

 

任务代码修改完毕,执行任务的代码无需修改。再次执行程序看看,

 

 

从执行结果来看,程序刚开始执行就结束了,这是因为线程池一开始就被关闭了,无限循环响应了中段线程的指令。 

 

 shoudown与shoudownnow的区别

任务结束。看完第二小节。再来看第三小节,shoudown与shoudownnow的区别,一共有6点不同。我们依次来看,

首先是调用方法后线程池是否立即关闭。shoudown不是,shoudownnow是,

线程池是否延时关闭,shoudown是,shoudownnow不是。

线程池关闭后是否不再接受新任务,他们两个都不再接受新任务,

是否会继续执行完队列中的任务?houdown是,shoudownnow不是。

是否会返回任务队列中未执行的任务下,shoudown不是,shoudownnow是。

线程池状态是怎样的,shoudown方法会将状态设置为shoudown,shoudownnow方法会将状态设置为stop,

 

 

关于线程池状态,后续课程单独再讲,这里就不再展开讲了。至此shoudown与shoudownnow的区别介绍完了,大家如果有需要补充的,请在视频下方留言。 

总结

 

最后总结一下本节内容,本节介绍了关闭线程池的方法,shoudownnow它的作用及用法,这里就不再赘述了。在实际开发中一般不会用它来关闭线程池,大多数还是用的shoudown方法。另外我们也列举了shoudown与shoudownnow的区别,大家可以截屏保存下来。本地

 

 

附录:

笔记完整文本:

今天介绍另一个关闭线程池的方法shoudownnow,本节内容有三个小节,第一小节介绍下shoudownnow,第二小节演示一个停不下来的任务。第三小节介绍shoudown与shoudownnow的区别。首先来看第一小节,shoudownnow方法的作用是关闭线程时不再接受新任务,并且尝试停止正在执行的任务。返回任务对应中未执行的任务还是以历史的集合形式返回的,shoudownnow是如何停止任务的呢?来到他的方法内部,我们可以看到它是通过interruptworks方法来中断线程池中所有的线程在interrupt的works的方法内部,再中断所有已经开始工作的线程,具体的做法是调用线程的interrupt的方法给线程发送中断指令,对于无限循环的任务来说,不响应线程中断指令,就意味着任务停不下来,这个例子待会会在第二小节中延迟,关于使用shoudownnow方法。 我们需要注意一点的是我们不能像使用shoudown那样使用shoudownnow。shoudownnow只有在需要立即关闭线程池的时候使用,日常开发中一般首选shoudown来关闭线程值,接下来动画演示下shoudownnow执行过程,这是一个正在运行的线程池。当我们使用shoudownnow关闭它时,线程池就立即停止所有正在执行的任务,并且当我们向线程池中提交新任务时,还会以当时设定的任务拒绝策略来处理该任务,再将任务队列中还会执行的任务返回给调用者,调用者拿到这些未执行的任务后可自行处理。下面我们来演示下shoudownnow方法,编写一个任务task,任务内容是输出当前线的名称和任务编号,接下来我们来执行该任务。 首先创建一个线程池,这里就以单个线程的线程池为例,然后向线程池中提交三个任务,三个任务的编号分别是123接着调用shoudownnow方法关闭线程池,接收shoudownnow方法返回值。遍历刚刚返回的任务列表,调用每个任务的run方法将他们执行完。至此论方法编写完成,整个例子也编写完成执行程序,观察执行结果。从执行结果来看,一号任务是线程池执行的,二号和三号两个任务是main线程执行的,说明二号和三号两个任务是线程时关闭以后返回给调用者的,再由调用者线程执行。 介绍完下当的方法,再来看一个特别的任务。停不下来的任务。修改任务代码,将输出的内容使用for循环无限输出,看看任务是否能够停下来,任务代码修改完毕,执行任务的代码还是沿用之前的,不需要提交那么多任务,只需提交一个任务即可,执行任务的代码也修改完毕,再执行程序看看从执行结果来看,现金池虽然已经关闭,但任务还未结束,针对这种情况加入响应中断现成的代码就可以解决。使用if判断线程是否被中断,当线程被中断时,直接return任务代码修改完毕,执行任务的代码无需修改。再次执行程序看看,从执行结果来看,程序刚开始执行就结束了,这是因为线程池一开始就被关闭了,无限循环响应了中段线程的指令。 任务结束到未来第二小节。再来看第三小节,shoudown与shoudownnow的区别,一共有6点不同。我们以此来看,首先是调用方法后线程池是否立即关闭。shoudown不是,shoudownnow是,线程池是否延时关闭,shoudown是,shoudownnow不是。线程池关闭后是否不再接受新任务,他们两个都不再接受新任务,是否会继续执行完队列中的任务?houdown是,shoudownnow不是。是否会返回任务队列中未执行的任务下,shoudown不是,shoudownnow是。线程池状态是怎样的,shoudown方法会将状态设置为shoudown,shoudownnow方法会将状态设置为stop,关于限制时状态,后续课程单独再讲,这里就不再展开讲了。至此shoudown与shoudownnow的区别介绍完了,大家如果有需要补充的,请在视频下方留言。 最后总结一下本节内容,本节介绍了关闭线程池的方法,瞎打闹它的作用及用法,这里就不再赘述了。在实际开发中一般不会用它来关闭浅层值,大多数还是用的下档方法。另外我们也列举了下档与下档道的区别,大家可以截屏保存下来。本地的代码地址如下,大家如果有需要的话可以先去查看。

标签:区别,shoudown,任务,线程,关闭,shoudownnow,执行
来源: https://www.cnblogs.com/cj8357475/p/16030877.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有