• 9.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的区别介绍完了,大家如果有需要补充的,请在视频下方留言。 最后总结一下本节内容,本节介绍了关闭线程池的方法,瞎打闹它的作用及用法,这里就不再赘述了。在实际开发中一般不会用它来关闭浅层值,大多数还是用的下档方法。另外我们也列举了下档与下档道的区别,大家可以截屏保存下来。本地的代码地址如下,大家如果有需要的话可以先去查看。

  • 相关阅读:
    枚举求解,也叫暴力破解
    多线程之线程的中止
    beginners with the Multithreading programming
    EditBox control Update Problem (A CString type EditBox control in a loop cannot be updated immidiately)
    有关多线程的一些技术问题
    多线程编程基础知识
    VC的若干实用小技巧 (如何干净的删除一个类)
    进入MFC讲坛的前 (Window 程序详细分析)
    Multithreading using MFC in Plain English: Part I
    关于在VS2005环境下无法从源视图切换到设计视图的解决方案
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16030877.html
Copyright © 2020-2023  润新知