首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

安全优雅停止Java线程

文/朱季谦 首先,先抛出一个问题,该如何安全而优雅停止线程?...这道问题的背后,可以很小,小到只是简单终止一个Thread线程,也可以很大,大到例如Dubbo应用的优雅下线......它们其实都有一个共同之处,即非一刀断式暴力停止某个进程或者线程,而是能够实现在终止过程中...,有机会去清理资源,跑完剩余的任务,最后没有任何资源在运行了,才做最后结束,这才算安全而优雅停止。...以stop方式终结线程的方法已经过期,即不再建议使用。 那么,可有其他方式来优雅结束线程运行吗? 这里,可以通过interrupt()方法间接实现。 为什么说是简接实现呢?...因为线程执行interrupt()方法并不会直接就终止线程。 接下来,就简单分析一下,interrupt()是如何实现安全而优雅终止线程的。

71940

如何优雅停止Java进程

目录 理解停止Java进程的本质 应该如何正确停止Java进程 如何注册关闭钩子 使用关闭钩子的注意事项 信号量机制 总结 理解停止Java进程的本质 我们知道,Java程序的运行需要一个运行时环境...因此,所谓停止Java进程,本质上就是关闭JVM。 那么,哪些情况会导致JVM关闭呢? ? 应该如何正确停止Java进程 通常来讲,停止一个进程只需要杀死进程即可。...那么,我们是否可以结合操作系统的信号量机制和JVM的关闭钩子实现优雅关闭Java进程呢?...< 1000000; i++) { list.add(new Object()); } } } 总结 网上有文章总结说可以直接使用监听信号量的机制来实现优雅关闭...因为单纯监听信号量,并不能覆盖到异常关闭JVM的情形(如:RuntimeException或OOM),这种方式与注册关闭钩子的区别在于: 1.关闭钩子是在独立线程中运行的,当应用进程被kill的时候

6.1K31
您找到你想要的搜索结果了吗?
是的
没有找到

如何优雅停止 Spring Boot 应用?

首先来介绍下什么是优雅停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求。...Servlet 的 Web 应用程序都支持优雅停止。...然后需要在 application.yml 中添加一些配置来启用优雅停止的功能: # 开启优雅停止 Web 容器,默认为 IMMEDIATE:立即停止 server: shutdown: graceful...然后在这个时候,调用 http://localhost:8080/actuator/shutdown 就可以执行优雅停止,返回结果如下: { "message": "Shutting down...: Shutting down ExecutorService 'applicationTaskExecutor' 从日志中也可以看出来,当调用 shutdown 接口的时候,会先等待请求处理完毕后再优雅停止

1.4K20

如何优雅停止 Spring Boot 应用?

首先来介绍下什么是优雅停止,简而言之,就是对应用进程发送停止指令之后,能保证正在执行的业务操作不受影响,可以继续完成已有请求的处理,但是停止接受新请求。...Servlet 的 Web 应用程序都支持优雅停止。...然后需要在 application.yml 中添加一些配置来启用优雅停止的功能: # 开启优雅停止 Web 容器,默认为 IMMEDIATE:立即停止 server: shutdown: graceful...然后在这个时候,调用 http://localhost:8080/actuator/shutdown 就可以执行优雅停止,返回结果如下: { "message": "Shutting down...Shutting down ExecutorService 'applicationTaskExecutor' 从日志中也可以看出来,当调用 shutdown 接口的时候,会先等待请求处理完毕后再优雅停止

1.9K20

Kubernetes 中如何保证优雅停止 Pod

作者:吴叶磊 一直以来我对优雅停止 Pod 这件事理解得很单纯:不就利用是 PreStop hook 做优雅退出吗?...但最近发现很多场景下 PreStop Hook 并不能很好完成需求,这篇文章就简单分析一下“优雅停止 Pod”这回事儿。 何谓优雅停止?...到了分布式系统中,优雅停止就不仅仅是单机上进程自己的事了,往往还要与系统中的其它组件打交道。...这个过程很不错,但它存在一个问题就是我们无法预测 Pod 会在多久之内完成优雅退出,也无法优雅应对“优雅退出”失败的情况。而在我们的产品 TiDB Operator 中,这就是一个无法接受的事情。...好像一下子所有东西都清晰了,这个 webhook 的逻辑很清晰,就是要保证所有相关的 Pod 删除操作都要先完成优雅退出前的准备,完全不用关心外部的控制循环是怎么跑的,也因此它非常容易编写和测试,非常优雅满足了我们

7.5K70

Kubernetes 中如何保证优雅停止 Pod

一直以来我对优雅停止 Pod 这件事理解得很单纯:不就利用是 PreStop Hook 做优雅退出吗?...但最近发现很多场景下 PreStop Hook 并不能很好完成需求,这篇文章就简单分析一下“优雅停止 Pod”这回事儿。 何谓优雅停止?...到了分布式系统中,优雅停止就不仅仅是单机上进程自己的事了,往往还要与系统中的其它组件打交道。...这个过程很不错,但它存在一个问题就是我们无法预测 Pod 会在多久之内完成优雅退出,也无法优雅应对“优雅退出”失败的情况。而在我们的产品 TiDB Operator 中,这就是一个无法接受的事情。...好像一下子所有东西都清晰了,这个 webhook 的逻辑很清晰,就是要保证所有相关的 Pod 删除操作都要先完成优雅退出前的准备,完全不用关心外部的控制循环是怎么跑的,也因此它非常容易编写和测试,非常优雅满足了我们

2K20

优雅停止Pod

作者: 吴叶磊 一直以来我对优雅停止 Pod 这件事理解得很单纯:不就利用是 PreStop hook 做优雅退出吗?...但最近发现很多场景下 PreStop Hook 并不能很好完成需求,这篇文章就简单分析一下“优雅停止 Pod”这回事儿。 1 何谓优雅停止?...到了分布式系统中,优雅停止就不仅仅是单机上进程自己的事了,往往还要与系统中的其它组件打交道。...3 . grace period超出之后,kubelet发送SIGKILL干掉尚未退出容器; 这个过程很不错,但它存在一个问题就是我们无法预测 Pod 会在多久之内完成优雅退出,也无法优雅应对...好像一下子所有东西都清晰了,这个 webhook 的逻辑很清晰,就是要保证所有相关的 Pod 删除操作都要先完成优雅退出前的准备,完全不用关心外部的控制循环是怎么跑的,也因此它非常容易编写和测试,非常优雅满足了我们

1.9K71

如何“优雅终止一个线程

我们的系统肯定有些线程为了保证业务需要是要常驻后台的,一般它们不会自己终止,需要我们通过手动来终止它们。...我们知道启动一个线程是start方法,自然有一个对应的终止线程的stop方法,通过stop方法可以很快速、方便终止一个线程,我们来看看stop的源代码。...假设有这样的一个业务场景,一个线程正在处理一个复杂的业务流程,突然间线程被调用stop而意外终止,这个业务数据还有可能是一致的吗?...这样是肯定会出问题的,stop会释放锁并强制终止线程,造成执行一半的线程终止,带来的后果也是可想而知的,这就是为什么jdk不推荐使用stop终止线程的方法的原因,因为它很暴力会带来数据不一致性的问题。...说了这么多,那如何优雅终止一个线程呢?看看下面的程序。 其实也不难,只需要添加一个变量,判断这个变量在某个值的时候就退出循环,这时候每个循环为一个整合不被强行终止就不会影响单个业务的执行结果。

1.4K80

如何让一个线程优雅退出

(参考如何优雅的"中断"一个线程?...但是这个时候是有一个问题的,比如我在循环中执行一个阻塞的方法,比如阻塞的队列的取操作,如果队列里没有数据,该线程在阻塞状态,我们想停止,但是此时使用标记字段就无能为力了。...sleep中,如何优雅的关闭线程 main方法和上面的一样,不贴了,当线程在sleep中,在main方法执行interrupt方法时,会出现异常,此时查看当前线程的中断状态为false(虽然我们调用了interrupt...wait中,如何优雅的关闭线程 class MyThreadForInterrupt extends Thread { Lock lock; Condition condition;...参考 线程中断方法interrupt、isInterrupted、interrupted方法_CBeann的博客-CSDN博客 如何优雅的"中断"一个线程? - 简书

17110

探索JAVA并发 - 如何优雅取消线程任务

通过线程启动一个异步的任务很容易,但想让它提前安全且快速结束确并不简单。如果线程外部的代码可以提前把目标线程置为“完成”状态,那么这个目标线程就是可取消的。...中断 线程中断是一种协作机制,通过这个机制通知某个线程,让它可以在合适的或可能的情况下停止任务。那么什么是合适/可能的情况呢?...参数为是否清除中断状态 private native boolean isInterrupted(boolean ClearInterrupted); } 调用中断方法 interrupt() 并不会让目标线程立即停止任务...,只是传递一个“可以停止”的信息给它。...Runnable { /** * 学渣强行翻译: * 如果任意线程中断了当前线程就会抛出此异常; * 这个异常抛出后当前线程的“中断”状态会被清空,即捕获异常后再调用

2.9K30

如何优雅停止 Springboot 运行

尤其是多线程的程序,退出时需要等待每个线程完成请求,需要很长时间,我们常常因为升级时间紧迫而使用 kill -9 强行杀死进程,这会带来很多问题。...2.2.9.Final ============================== Destroying Spring ============================== 容器中如何优雅关闭...spring.profiles.active=dev --server.port=8080 实验步骤 运行容器:docker-compose up 观察容器:docker-compose logs -f 停止容器...cn.netkiller.Application : Started Application in 2.48 seconds (JVM running for 2.923) 停止容器...exited with code 137 结论,docker kill = kill -9 现在你应该明白什么时候该使用什么命令终止程序了吧,同时我们在写程序的时候,也应该将程序的运行状态反应出来,在我们停止程序运行的时候

6.8K20

优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止

在使用 SpringBoot 的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。...我们很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续处理完成。比如停止一些依赖的服务,输出一些日志,发一些信号给其他的应用系统,这个在保证系统的高可用是非常有必要的。...写一个start.sh用于启动springboot程序,然后写一个停止程序将服务停止。  ...applicationContext) throws BeansException { context = applicationContext; } } 好了,SpringBoot的优雅关闭方法也都实现好了...整编:微信公众号,搜云库技术团队,ID:souyunku 在真实的工作中的时候第三种比较常用,程序中一般使用内存队列或线程池的时候最好要优雅的关机,将内存队列没有处理的保存起来或线程池中没处理完的程序处理完

2.3K10

为什么说volatile+interrupt是停止线程优雅的姿势?

正确的使用姿势是使用两阶段终止的模式,即一个线程发送终止指令,另一个线程接收指令,并且决定自己在何时停止。...while循环不断判断,如果项目中用不到while的话,可以在关键节点判断,然后退出run方法即可」 使用interrupt方法 假如我们的任务中有阻塞的逻辑,如调用了Thread.sleep方法,如何让线程停止呢...从线程状态转换图中寻找答案 从图中可以看到如果想让线程进入终止状态的前提是这个线程处于运行状态。当我们想要终止一个线程的时候,如果此时线程处于阻塞状态,我们如何把它转换到运行状态呢?...taskThread.start(); } public void stop() { taskThread.interrupt(); } } 依次调用start方法和stop方法,发现线程并没有停止...「其实当线程处于运行状态时,interrupt方法只是在当前线程打了一个停止的标记,停止的逻辑需要我们自己去实现」 「Thread类提供了如下2个方法来判断线程是否是中断状态」 isInterrupted

79230
领券