gpt4 book ai didi

java - 当 JVM 停止线程时,为 java 用户线程调用清理方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:38 25 4
gpt4 key购买 nike

我有在 Linux 上运行的 J2SE 应用程序。我已经停止应用程序脚本,我正在其中杀死 J2SE pid。这个 J2SE 应用程序有 6 个无限运行的用户线程,它们将轮询后端数据库中的一些特定记录。

当这个 java pid 被杀死时,我需要为每个长时间运行的线程执行一些清理操作,比如连接到数据库并将一些正在进行的事务的状态设置为空。

有没有办法在每个线程中编写一个方法,在线程将要停止时由 JVM 调用。

最佳答案

您始终可以尝试使用 Runtime.addShutDownHook 实现关闭 Hook ,或者将长时间运行的代码封装在 try 中,将清理封装在 finally 中。

一个简单的例子,大致完成你想做的事情(但为了简单起见,对于单个工作线程)。

public class Test extends Thread {

static volatile boolean keepRunning = true;

public static void main(String[] args) throws InterruptedException {
final Thread t = new Test();
t.start();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Shutting down...");
keepRunning = false;
t.interrupt();
try {
t.join();
} catch (InterruptedException e) {
}
}
});
}

public void run() {
while (keepRunning) {
System.out.println("worknig...");
try {
sleep(1000);
} catch (InterruptedException e) {
}
}

System.out.println("cleaning up.");
}
}

使用 Ctrl-C 中断时的输出:

worknig...
worknig...
worknig...
^CShutting down...
cleaning up.

kill pid杀死时的输出

worknig...
worknig...
worknig...
worknig...
Shutting down...
cleaning up.

kill -9 pid杀死时的输出

worknig...
worknig...
worknig...
worknig...
worknig...
Killed

(未执行清理。)

关于java - 当 JVM 停止线程时,为 java 用户线程调用清理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2793175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com