spring项目优雅关闭线程池

ThreadPoolExecutor 介绍

java中线程池的三个方法shutdown()shutdownNow()awaitTermination()

shutdown:

  • 拒绝新任务提交到线程池
  • 待执行与正在执行的任务继续执行

shutdownNow

  • 拒绝提交新任务到线程池
  • 取消队列中等待执行的任务
  • 尝试取消正在执行任务

awaitTermination(long timeOut, TimeUnit unit)

  • 阻塞线程等待所有待执行以及正在执行的任务执行完成
  • 或者等到超时
  • 或者线程被中断抛出中断异常
    然后返回true(shutdown请求后所有任务执行完毕)或false(已超时)

三者的异同:

  • shutdownshutdownNow之后都拒绝提交任务,awaitTermination可以继续提交任务。
  • awaitTermination()是阻塞的,返回结果是线程池是否已停止(true/false)shutdown/Now不阻塞。
  • shutdownNow 立即关闭
  • shutdown 优雅关闭

优雅停机

了解完以上这些概念,现在就是在spring中的什么时机进行这些方法的调用呢?
spring的容器在关闭的时候会发布一个关闭事件,所以我们可以监听spring容器关闭事件,在接收到事件的时候执行优雅关闭。

如果你使用的是spring的线程池也就是@Async注解那么你可以直接在配置中指定优雅关闭即可

executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60)

你可能感兴趣的:(spring,java)