小白记录,本人涉及多线程不深,记录一下看到的多线程的资料和理解。

    在使用ThreadPoolExecutor时,有3个关闭方法(shutdown()shutdownNow()awaitTermination()),查了下资料对ThreadPoolExecutor的3个方法有了大概的认知。

    shutdown():

      将线程池状态设置为shutdown,并不会立即停止:

        1).停止接收外部submit的任务。

        2).会执行完内部正在跑的任务和队列里等待的任务。

        3).执行完所有任务才关闭。

    shutdownNow():

      将线程池状态设置为stop,想立即停止:

        1).shutdownNow和shutdown一样,先停止接收外部提交的任务。

        2).忽略正在队列等待的任务。

        3).尝试将在跑的任务Thread.interrupt()中断(如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的)。

        4).返回未执行的记录列表。

    awaitTermination(long timeOut,TimeUnit unit):

      当前线程阻塞:

        1).等所有已提交的任务执行完。

        2).等超时时间到。

        3).或者线程被中断,抛出InterruptedException然后返回true(shutdown所有任务执行完毕的时候)或false(超时)。

      shutdown()和shutdownNow()的区别:

        shutdown()只是关闭了提交通道,用submit()是无效的;而内部该怎么跑还是怎么跑,跑完再停。
        shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大。
      shutdown()和awaitTermination()的区别:

        shutdown()后,不能再提交新的任务进去;但是awaitTermination()后,可以继续提交。

        awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false);shutdown()不阻塞。

  总结

      1).优雅的关闭,用shutdown()。

      2).想立马关闭,并得到未执行任务列表,用shutdownNow()。

      3).优雅的关闭,并允许关闭声明后新任务能提交,用awaitTermination()。

猜你喜欢

转载自www.cnblogs.com/hyh98/p/Wer.html
今日推荐