为ExecutorService增加shutdown hook】的更多相关文章

public class ShutdownHook { private static final ShutdownHook INSTANCE = new ShutdownHook(); private List<ExecutorService> executorServices = Lists.newArrayList(); private AtomicBoolean closed = new AtomicBoolean(false); public static ShutdownHook g…
我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 背景 如果想在 Java 进程退出时,包括正常和异常退出,做一些额外处理工作,例如资源清理,对象销毁,内存数据持久化到磁盘,等待线程池处理完所有任务等等.特别是进程异常挂掉的情况,如果一些重要状态没及时保留下来,或线程池的任务没被处理完,有可能会造成严重问题.那该怎么办呢? Java 中的 Shutdow…
DK1.3介绍了java.lang.Runtime class的addShutdownHook()方法.如果你需要在你的程序关闭前采取什么措施,那么关闭钩子(shutdown hook)是很有用的. JDK1.3介绍了java.lang.Runtime class的addShutdownHook()方法.如果你需要在你的程序关闭前采取什么措施,那么关闭钩子(shutdown hook)是很有用的. 要加关闭钩子(shutdown hook),需要先创建一个java.lang.Thread 类的实…
背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作,比如发一个message到另一个模块,并更新数据库状态.突然终止,可能会让这个操作只完成一半,从而导致数据不一致. 解决方案是:参考数据库Transaction原子性的概念,将这一系列重要操作看作一个整体,要么全部完成,要么全部不完成.为方便表述,我们把这一系列重要操作记为操作X. 当程序即将退出时…
Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:        这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭.所以这些钩子可以在jvm关闭的时候进行内存清理.对象销毁等操作.   用途 1应用程序正常退出,在退出时执行特定的业务逻辑,或者关闭资源等操作. 2虚拟机非正常退出,比如…
在很多实际应用环境中,当用户关了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不做清理工作,例如在Tomcat的部署应用中,通过实例化一个Server对象来启动servlet容器,并调用其start方法,然后逐个调用组件的start方法,正常情况下,为了让Server对象能够关闭这些已经启动的组件,你应该向指定的端口发送关闭命令,如果你只是简单的突然退出,例如在应用程序过程中关闭控制台,可能会发生一些意想不到的事情. 幸运的是,java为程序员提…
程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.JAVA中的ShutdownHook提供了比较好的方案. JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用: 程序正常退出 使用System.exit() 终端使用Ctrl+C触发的中断 系统关闭 OutOfMemory宕机 使用Kill pid命令干掉进程(注:在使用…
可以关闭 ExecutorService,这将导致其拒绝新任务.提供两个方法来关闭 ExecutorService. shutdown() 方法在终止前允许执行以前提交的任务; shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务.在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务.应该关闭未使用的 ExecutorService 以允许回收其资源. 下列方法分两个阶段关闭 ExecutorService.第一阶段调用 shutdown 拒绝传入任…
1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**     * Executes the given command at some time in the future.  The command     * may execute in a new thread, in a pooled thread, or in the calling     * thread, at the…
首先介绍两个重要的接口,Executor和ExecutorService,定义如下: public interface Executor { void execute(Runnable command); } public interface ExecutorService extends Executor { //不再接受新任务,待所有任务执行完毕后关闭ExecutorService void shutdown(); //不再接受新任务,直接关闭ExecutorService,返回没有执行的任…
源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /**      * Executes the given command at some time in the future.  The command      * may execute in a new thread, in a pooled thread, or in the calling      * thread, at the discre…
稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 WordPress Hook 运作大致做个简单的说明,而预设读者是理解基本的 PHP function 语法及运作,但对 WordPress Hook 机制不是很明白. Hook机制里登场的角色 先从“登场角色”的个别说明开始: WordPress核心 指的是 WordPress 内建的程式码架构…
稍有接触过 WordPress 主题或插件制作修改的朋友,对 WordPress 的Hook机制应该不陌生,但通常刚接触WordPress Hook 的新手,对其运作原理可能会有点混乱或模糊.本文针对 WordPress Hook 运作大致做个简单的说明,而预设读者是理解基本的 PHP function 语法及运作,但对 WordPress Hook 机制不是很明白. Hook机制里登场的角色 先从“登场角色”的个别说明开始: WordPress核心 指的是 WordPress 内建的程式码架构…
最近做的一个Web项目,发现shutdown.sh后,无法关掉tomcat进程. ps -ef | grep tomcat 返回tomcat进程仍然存在.经过调查发现是因为在Web应用中启动了线程池,shutdown只会关闭web线程(默认监听端口8080),关闭线程(默认监听8005):对于通过线程池(包括Executors创建的ExecutorService),只能是手动清除.使用tomcat容器的好处就在于能够包住应用的生命周期,比如解决这个问题就可以通过实现ServletContextL…
开篇前,我们先来看看不使用线程池的情况: new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 那你就太out了,new Thread的弊端如下:a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占…
https://blog.csdn.net/zaozi/article/details/38854561 https://blog.csdn.net/z69183787/article/details/48683965 前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 犯了一些错误.在解决的过程中,偶尔看到了日本人写的一篇文章简单明了,通俗易懂 所…
一.介绍 ExecutorService是java.util.concurrent包中的一个线程池实现接口.其有两个实现类: 1)ThreadPoolExecutor:普通线程池通过配置线程池大小,能有效管理线程的调度,在执行大量异步线程时提高程序的性能. /** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * * @param corePoolSize the number of…
16. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 ExecutorService 很类似于一个线程池.实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现. ExecutorService 例子 以下是一个简单的 ExecutorService 例子: ExecutorService exec…
1.Executor和ExecutorService Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类,一般来说,Runnable任务开辟在新线程中的使用方法为:new Thread(new RunnableTask())).start(),但在Executor中,可以使用Executor而不用显示…
有几种不同的方式来将任务委托给 ExecutorService 去执行: execute(Runnable) submit(Runnable) submit(Callable) invokeAny(…) invokeAll(…) execute(Runnable) execute(Runnable) 方法要求一个 java.lang.Runnable 对象,然后对它进行异步执行.以下是使用 ExecutorService 执行一个 Runnable 的示例: ExecutorService ex…
Shutdown /** * 虚拟机关闭步骤 * @since 1.3 */ class Shutdown { /* 关闭状态 */ private static final int RUNNING = 0; private static final int HOOKS = 1; private static final int FINALIZERS = 2; private static int state = RUNNING; /* Should we run all finalizers…
Executor public interface Executor { void execute(Runnable command); } ExecutorService ExecutorService是一个接口,继承了Executor接口,定义了一些生命周期的方法 public interface ExecutorService extends Executor { //顺次地关闭ExecutorService,停止接收新的任务,等待所有已经提交的任务执行完毕之后,关闭ExecutorSer…
1. 执行器服务 ExecutorService java.util.concurrent.ExecutorService 接口表示一个异步执行机制,使我们能够在后台执行任务.因此一个 ExecutorService 很类似于一个线程池.实际上,存在于 java.util.concurrent 包里的 ExecutorService 实现就是一个线程池实现. ExecutorService 例子 以下是一个简单的 ExecutorService 例子: ExecutorService execu…
线程池 ExecutorService 相信java开发都用到,这里做个简单笔记 一 Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行. newSingleTh…
Hook 概念 百度上的概念 每个Hook都有一个相关的指针列表,后加入的Hook再链表的开始,先加入的在链表的尾部 即后加入先获得控制权 Hook 原理 原本的流程 graph LR id1(MessageBoxA)--<br>原本的进程-->id2(MessageBoxB); id2(MessageBoxB)-->id1(MessageBoxA) hook后的流程 graph LR id1(MessageBoxA)--<br>step1:Hook-->id2(…
Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),该方法接收一个Runable实例,它用来执行一个任务,任务即一个实现了Runnable接口的类,一般来说,Runnable任务开辟在新线程中的使用方法为:new Thread(new RunnableTask())).start(),但在Executor中,可以使用Executor而不用显示地创建线程:executor.execute(new …
文章目录 使用shutdown 使用shutdownNow 使用ExecutorService来停止线程服务 之前的文章中我们提到了ExecutorService可以使用shutdown和shutdownNow来关闭. 这两种关闭的区别在于各自的安全性和响应性.shutdownNow强行关闭速度更快,但是风险也更大,因为任务可能正在执行的过程中被结束了.而shutdown正常关闭虽然速度比较慢,但是却更安全,因为它一直等到队列中的所有任务都执行完毕之后才关闭. 使用shutdown 我们先看一个…
我最近发现一个问题,当应用程序关闭时,我们的应用程序没有正确执行在IHostedService中的StopAsync方法.经过反复验证发现,这是由于某些服务对关闭信号做出响应所需的时间太长导致的.在这篇文章中,我将展示出现这个问题的一个示例,并且会讨论它为什么会发生以及如何避免这种情况出现. 作者:依乐祝 首发地址:https://www.cnblogs.com/yilezhu/p/12952977.html 英文地址:https://andrewlock.net/extending-the-s…
k8s-graceful-shutdown:该库提供了使用 Kubernetes 实现 Graceful Shutdown(优雅退出) Node.js App 的资源. 问题描述 在 kubernetes 中运行微服务时.我们需要处理 kubernetes 发出的终止信号.这样做的正确方法是: 监听 SIGINT, SIGTERM 收到信号后,将服务置于不健康模式(/health 路由应返回状态码 4xx,5xx) 在关闭之前添加宽限期,以允许 kubernetes 将您的应用程序从负载均衡器中…
1,为什么要使用线程池:Executors 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统交互.在这种情形下,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即创建大量空闲的线程,程序将Runnable对象或Callable对象传给线程池,线程池就会启动1个空闲的线程来执行它们的run()或者call()方法, run()或call()方法执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一…