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

如何在Eclipse启动的进程上执行shutdown hook

在Eclipse启动的进程上执行shutdown hook,可以通过以下步骤实现:

  1. 在Eclipse中创建一个Java项目。
  2. 在项目中创建一个Java类,例如命名为ShutdownHookExample
  3. ShutdownHookExample类中,添加以下代码:
代码语言:java
复制
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ShutdownHookExample {
    public static void main(String[] args) {
        // 创建一个单线程的线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // 提交一个任务到线程池中
        executor.submit(() -> {
            try {
                System.out.println("任务正在执行...");
                TimeUnit.SECONDS.sleep(5);
                System.out.println("任务执行完毕");
            } catch (InterruptedException e) {
                System.out.println("任务被中断");
            }
        });

        // 添加一个关闭钩子,在JVM关闭时执行
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("执行关闭钩子");
            executor.shutdown();
            try {
                // 等待线程池关闭
                executor.awaitTermination(5, TimeUnit.SECONDS);
            } catch (InterruptedException e) {
                System.out.println("线程池关闭被中断");
            }
            System.out.println("关闭钩子执行完毕");
        }));

        // 主线程休眠10秒钟,然后退出
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            System.out.println("主线程被中断");
        }
    }
}
  1. 运行ShutdownHookExample类的main方法。
  2. 在运行过程中,按下Ctrl+C,即可触发关闭钩子的执行。

通过以上步骤,可以在Eclipse启动的进程上执行shutdown hook。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ShutdownHook原理

() { System.out.println("I'm shutdown hook..."); } }); 有了ShutdownHook我们可以 在进程结束时做一些善后工作,例如释放占用的资源...是异步执行的,但会等所有hook执行完毕才会退出。...,调用Shutdown.exit结束进程 这样覆盖了代码中主动结束进程和被kill杀死进程的场景。...总结 综上,我们得出一些结论 重写捕获信号需要注意主动退出进程,否则进程可能永远不会退出,捕获信号的执行是异步的 用户级的ShutdownHook是绑定在系统级的ShutdownHook之上,且用户级是异步执行...,系统级是同步顺序执行,用户级处于系统级执行顺序的第二位 ShutdownHook 覆盖的面比较广,不论是手动调用接口退出进程,还是捕获信号退出进程,抑或是用户线程执行完毕退出,都会执行ShutdownHook

64141

java(JVM)结束时释放JNI资源(Runtime.addShutdownHook)

所以这个方案不可行,事实也是正是这样,执行shutdown.sh停止tomcat服务器时,执行top命令显示,java进程仍然在运行中,而且占用着大量的内存。...也没有log “release JNI resoure…”输出,显示finalize()方法没有被执行。 所以如何在JVM结束时释放静态加载的动态库中的资源还是得另想办法。...下面是addShutdownHook方法的原文说明(部分): Registers a new virtual-machine shutdown hook....当JVM结束时(正常结束,或被Ctrl-C中止,或因系统事件(如logoff ,shutdown))会执行用addShutdownHook方法注册的线程。...所以确保静态加载的JNI资源释放的办法,就是在加载动态库的时候,向JVM注册一个hook线程,用于执行release()方法。

96020
  • 如何优雅地停止Java进程

    ,即:JVM,启动Java进程即启动了一个JVM。...() System.out.println("do shutdown hook"); } }); 为JVM注册关闭钩子的时机不固定,可以在启动Java进程之前,也可以在Java进程之后...使用关闭钩子的注意事项 1.关闭钩子本质上是一个线程(也称为Hook线程),对于一个JVM中注册的多个关闭钩子它们将会并发执行,所以JVM并不保证它们的执行顺序;由于是并发执行的,那么很可能因为代码不当导致出现竞态条件或死锁等问题...2.Hook线程会延迟JVM的关闭时间,这就要求在编写钩子过程中必须要尽可能的减少Hook线程的执行时间,避免hook线程中出现耗时的计算、等待用户I/O等等操作。...Java进程(详见:Java程序优雅关闭的两种方法),实际上这是有问题的。

    6.4K31

    SpringCloud微服务如何优雅停机及源码分析

    方式一:kill -9 java进程id【不建议】 kill -9 属于强杀进程,首先微服务正在执行的任务被强制中断了;其次,没有通过Eureka注册中心服务下线,Zuul网关作为Eureka Client...给JVM进程发送TERM终止信号时,会调用其注册的 Shutdown Hook,当SpringBoot微服务启动时也注册了 Shutdown Hook 而直接调用/shutdown端点本质和使用 Shutdown...endpoints.shutdown.enabled = true endpoints.shutdown.sensitive = false 所有问题都导向了 Shutdown Hook会执行什么??...注意: 由于在注销上一步已经停掉了定时心跳线程,否则注销后的下次心跳又会导致服务上线 总结 使用kill、kill -15 或 /shutdown端点都会调用Shutdown Hook,触发Eureka...端缓存的刷新,使得服务不会再被调用,此时再通过/shutdown端点 或 暴利的kill -9 停止服务进程,可以达到优雅下线的效果 如希望回滚,可以通过几种方式 还是/service-registry

    2K30

    研究优雅停机时的一点思考

    在以前,我们发布 WEB 应用通常的步骤是将代码打成 war 包,然后丢到一个配置好了应用容器(如 Tomcat,Weblogic)的 Linux 机器上,这时候我们想要启动/关闭应用,方式很简单,运行其中的启动...一个显而易见的做法便是,根据应用名找到进程 id,杀死进程 id 即可达到关闭应用的效果。 上述的场景描述引出了我的疑问:怎么优雅地杀死一个 springboot 应用进程呢?...收到了通知,紧接着执行了测试代码中的 Shutdown Hook,最后执行了 DisposableBean#destory() 方法。...在容器初始化时,ApplicationContext 便已经注册了一个 Shutdown Hook,这个钩子调用了 Close() 方法,于是当我们执行 kill -15 pid 时,JVM 接收到关闭指令...最后再补充下整理这个问题时,自己对 jvm shutdown hook 的一些理解。

    4.3K81

    SpringBoot 优雅停机的正确姿势

    简单的说,就是向应用进程发出停止指令之后,能保证正在执行的业务操作不受影响,直到操作运行完毕之后再停止服务。...并且不再启动新的任务 3.当应用准备关闭的时候,按需向外发出信号,告知其他应用服务准备接手,以保证服务高可用 如果暴力的关闭应用程序,比如通过kill -9 命令强制直接关闭应用程序进程,可能会导致正在执行的任务数据丢失或者错乱...那么如何在不影响正在执行的业务的情况下,将应用程序安全的进行关闭呢?...二、方案实践 SpringBoot 官方文档上,已经告诉开发者只需要实现特定接口即可监听到项目启动成功与关闭时的事件,相关接口如下: CommandLineRunner接口:当应用启动成功后但在开始接受流量之前...,都会向 JVM 注册一个关闭钩子shutdown hook,以确保ApplicationContext在退出的时候,通过这个勾子通知 JVM,实现服务正常的关闭,以下介绍的所有关闭服务的方法,都是基于这一原理进行实现的

    3.1K30

    哦,这就是java的优雅停机?(实现及原理)

    将自己将要被销毁的消息通知给子进程 各种资源的释放 ......在 shutdown 之后会变成 SHUTDOWN 状态,无法接受新的任务,随后等待正在执行的任务执行完成。...shutdown() :启动顺序关闭,其中执行先前提交的任务,但不接受新任务。如果已经关闭,则调用没有附加效果。此方法不等待先前提交的任务完成执行。...shutdownNow():尝试停止所有正在执行的任务,停止等待任务的处理,并返回正在等待执行的任务的列表。当从此方法返回时,这些任务将从任务队列中耗尽(删除)。此方法不等待主动执行的任务终止。...同时,也解释了一些应用执行 kill -15 pid 无法退出的问题,如:中断被阻塞了,或者hook运行了死循环代码。

    2K20

    Spring Boot程序正确停止的姿势

    Spring Boot提供了2种优雅关闭进程的方式: 基于管理端口关闭进程 基于系统服务方式关闭进程 基于管理端口关闭进程 基于管理端口方式实现进程关闭实际上是模块spring-boot-actuator...=info, health, shutdown 完成上述准备工作以后,启动Spring Boot应用,通过调用POST http://localhost:8000/ops/shutdown即可关闭进程。...通过系统服务方式停止进程 Spring Boot支持直接将打包好的可执行jar包以系统服务方式运行,具体实现方式如下所述。 首先,将应用打包为完全可执行的jar包。...如果启动服务失败,请检查对应名称的服务文件是否放在正确位置(如:systemd系统需要放在/etc/systemd/system目录下),或者检查启动服务的用户权限,一些错误情形可以参考:https:/...logger.info("do something on shutdown hook"); } }); SpringApplication.run

    3.1K20

    数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    Yarn RM接收到请求(和yarn交互不重点分析) 3)在被分配的节点上的工作目录下启动launch_container.sh 4)在perJob模式下,最终调用的是YarnJobClusterEntrypoint...hook:避免JVM退出时被其他shutdown hook阻塞 4)打印YARN运行环境信息:用户名 5)从运行目录中加载flink conf 3、AM启动过程 1)创建并启动各类内部服务(包括...然后向YARN NM申请启动TaskManager进程,YARN NM启动Container的流程与AM Container启动流程基本类似。...三、TM启动过程 输出各软件版本及运行环境信息、命令行参数项、classpath等信息 注册处理各种SIGNAL的handler:记录到日志 注册JVM关闭保障的shutdown hook:避免JVM...退出时被其他shutdown hook阻塞 加载flink配置文件、初始化文件系统、启动各种内部服务(RpcService、HAService、BlobServer、HeartbeatServices

    96110

    如何优雅实现优雅停机?

    将自己将要被销毁的消息通知给子进程 各种资源的释放 ......ThreadPoolExecutor 在 shutdown 之后会变成 SHUTDOWN 状态,无法接受新的任务,随后等待正在执行的任务执行完成。...shutdown() :启动顺序关闭,其中执行先前提交的任务,但不接受新任务。如果已经关闭,则调用没有附加效果。此方法不等待先前提交的任务完成执行。...shutdownNow():尝试停止所有正在执行的任务,停止等待任务的处理,并返回正在等待执行的任务的列表。当从此方法返回时,这些任务将从任务队列中耗尽(删除)。此方法不等待主动执行的任务终止。...同时,也解释了一些应用执行 kill -15 pid 无法退出的问题,如:中断被阻塞了,或者hook运行了死循环代码。

    2K10

    数栈技术分享:一文带你了解Flink jm、tm启动过程和资源分配

    Yarn RM接收到请求(和yarn交互不重点分析) 3)在被分配的节点上的工作目录下启动launch_container.sh 4)在perJob模式下,最终调用的是YarnJobClusterEntrypoint...启动上下文 11)TaskManager 进程加载并运行 YarnTaskExecutorRunner(Flink TaskManager入口类),初始化流程完成后启动 TaskExecutor(负责执行...的handler:记录到日志 3)注册JVM关闭保障的shutdown hook:避免JVM退出时被其他shutdown hook阻塞 4)打印YARN运行环境信息:用户名 5)从运行目录中加载flink...三、TM启动过程 输出各软件版本及运行环境信息、命令行参数项、classpath等信息 注册处理各种SIGNAL的handler:记录到日志 注册JVM关闭保障的shutdown hook:避免JVM...退出时被其他shutdown hook阻塞 加载flink配置文件、初始化文件系统、启动各种内部服务(RpcService、HAService、BlobServer、HeartbeatServices

    1.7K20

    【转】Java中Runtime.exec的一些事 

    0.4 Runtime.addShutdownHook()方法可以注册一个hook在JVM执行shutdown的过程中,方法的参数只要是一个初始化过但是没有执行的Thread实例就可以。...Shutdown:当最后一个非精灵进程退出或者收到了一个用户中断信号、用户登出、系统shutdown、Runtime的exit方法被调用时JVM会启动shutdown的过程,在这个过程开始后,他会并行启动所有登记的...shutdown hook(注意是并行启动,这就需要线程安全和防止死锁)。...当shutdown过程启动后,只有通过调用halt方法才能中止shutdown的过程并退出JVM。 Abort: abort退出时JVM就是停止运行但并不一定进行shutdown。...这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行。

    3.1K20

    K8S 滚动更新如何优雅停止 Pod

    优雅停止(Graceful shutdown) 这个说法来自于操作系统,我们执行关机之后都得 OS 先完成一些清理操作,而与之相对的就是硬中止(Hard shutdown),比如拔电源。...到了分布式系统中,优雅停止就不仅仅是单机上进程自己的事了,往往还要与系统中的其它组件打交道。...简述滚动更新步骤 启动一个新的 pod 等待新的 pod 进入 Ready 状态 创建 Endpoint,将新的 pod 纳入负载均衡 移除与老 pod 相关的 Endpoint,并且将老 pod 状态设置为...,会执行 PreStop hook,hook 可以执行一个 HTTP GET请求 或者 exec命令,并且它们执行是阻塞的,可以利用这个特性来做优雅停止。... 会执行 PreStop hook,PreStop hook 执行完成后会向 pod 发送 SIGTERM 信号。

    5.9K10

    别乱用了,这才是 SpringBoot 停机的正确方式!!!

    何为优雅关机 就是为确保应用关闭时,通知应用进程释放所占用的资源 线程池,shutdown(不接受新任务等待处理完)还是shutdownNow(调用 Thread.interrupt进行中断) socket...,有时候也会出现无法关闭应用的情况(线上理想情况下,是bug就该寻根溯源) #查看jvm进程pid jps #列出所有信号名称 kill -l   > 基于微服务的思想,构建在 B2C 电商场景下的项目实战...当然是在jvm启动时就加载了自定义SignalHandler,关闭jvm时触发对应的handle。...registerShutdownInProgress) {//执行shutdown过程中不添加hook                 if (state > RUNNING)//如果已经在执行shutdown... else {//如果hooks已经执行完毕不能再添加hook。

    79230

    Contour 中 Envoy 优雅停服的实现与源码分析

    Envoy 的 Daemonset 中会新增一个容器,这个容器执行这个新的命令,暴露接口 当 preStop hook触发时,Envoy 容器和这个新的容器会被更新 当 pod 收到一个关闭的请求时,...boostrap 生成配置文件 /config/envoy.json 2: 主容器通过磁盘挂载共享 config 文件,并作为启动的配置参数启动 envoy 进程 3:envoy 和服务端通过 XDS...不存在说明暂时还不能关闭,接口会阻塞在这里 4-2:和envoy一样(pod 中容器关闭是没有顺序的,可以简单理解为并行执行),shutdown-manager 关闭前,会执行 preStop 钩子,执行...完成以上步骤,整个 pod 才可以退出 源码分析 从前面的设计文档得知,优雅停机主要跟 shutdown-manger这个进程有关,这里主要是分析 shutdown-manager 这个进程的源码。...使用方式如下,该命令会在 shutdown-manager 进程被杀死之前的 preStop 中被调用执行。

    94630

    启动tomcat错误解决方案集

    一、Eclipse tomcat 启动超时: 错误内容: Server JBoss v4.0 at localhost was unable to start within 50 seconds..../WEB-INF/classes 4,再就是最重要的要看工程下面是否缺少了work目录,由于CVS控制时不把work加如版本,所以checkout后没有这个目录,要手工加上有的工程就能自动编译,最开始的时候...端口被占用 解决方案一(推荐),修改tomcat/conf/server.xml文件 打开server.xml 将shutdown="SHUTDOWN"...>中8005改成不常用的端口号即可,比如9876 解决方案二,将占用8005的进程强行结束 (1) 在“运行”中输入CMD (2)在启动的窗口中输入netstat -ano,就可以看到所有端口占用的情况...,记下占用8005端口的程序的PID (3)打开“任务管理器”,点击菜单栏的“查看”,再点击“选择列”,选上“PID(进程标识符)” 或者在cmd中输入tasklist命令,回车,查看 (4)在进程中找个相应的

    1K20

    关于tomcat一些启动错误的解决方法

    作者:虚无境 链接: https://blog.csdn.net/qazwsxpcm/article/details/68946458 一、Eclipse tomcat 启动超时: 错误内容: Server.../WEB-INF/classes 4,再就是最重要的要看工程下面是否缺少了work目录,由于CVS控制时不把work加如版本,所以checkout后没有这个目录,要手工加上有的工程就能自动编译,最开始的时候...端口被占用 解决方案一(推荐),修改tomcat/conf/server.xml文件 打开server.xml 将shutdown="SHUTDOWN">中8005...改成不常用的端口号即可,比如9876 解决方案二,将占用8005的进程强行结束 (1) 在“运行”中输入CMD (2)在启动的窗口中输入netstat -ano,就可以看到所有端口占用的情况,记下占用...8005端口的程序的PID (3)打开“任务管理器”,点击菜单栏的“查看”,再点击“选择列”,选上“PID(进程标识符)” 或者在cmd中输入tasklist命令,回车,查看 (4)在进程中找个相应的

    1.6K30

    RASP攻防 —— RASP安全应用与局限性浅析

    典型的RSHUTDOWN方法如: image (3) 下午7.56.55.png (4)Module shutdown 所有请求处理完毕后,SAPI也关闭了(即服务器关闭),PHP调用各个模块的MSHUTDOWN...(1) 实现Hook Opcode 功能只需要改变 Hook Opcode 对应的处理函数即可,而 zend 预先就提供了一个现成的接口:zend_set_user_opcode_handler, 如:...mail() 、 error_log()、ImageMagick() 是常用于劫持的触发函数,原因是在运行的时候能够启动子进程,这样才能重新加载我们所设置的环境变量,从而劫持子进程所调用的库函数。...以mail函数为例:mail函数在运行时,会启动子进程来调用系统的sendmail,sendmail引用了getegid() 函数。...无论 RASP 是hook opcode 还是 hook function,本质上都没有从内存中删除所调用的函数,只是改变了走向,指向了我们自定义的函数。

    1.9K30

    Java 在 Linux 上的守护进程:如何优雅地终止和管理自启动程序??

    摘要本文将围绕 如何在 Java 中管理 Linux 上的守护进程 展开,尤其重点探讨如何优雅地 kill 自启动程序。...通过源码解析、使用案例分享以及核心类方法介绍,帮助开发者了解如何在 Linux 上编写和管理 Java 守护进程,同时学习如何在不破坏系统或导致数据丢失的情况下安全终止这些进程。...然而,守护进程一旦启动,如何在不中断系统其他服务的情况下优雅地终止它们则是一个需要仔细考虑的问题。...守护进程是一种在后台运行的线程,通常用于执行一些服务性任务,如垃圾回收、信号处理等。...&:将进程放入后台执行。守护进程的启动相对简单,然而,如何终止它们往往需要更细致的处理。3.

    12421
    领券