我在linux中运行J2SE应用程序。我已停止应用程序脚本,我正在杀死J2SE pid。这个J2SE应用程序有6个无限运行的用户线程,它们将轮询后端数据库中的某些特定记录。
当这个java pid被杀死时,我需要为每个长时间运行的线程执行一些清理操作,比如连接到DB并设置一些正在进行清空的事务的状态。
有没有办法在每个线程中编写一个方法,JVM会在线程停止时调用该方法。
答案 0 :(得分:7)
您始终可以尝试使用Runtime.addShutDownHook
实现关闭挂钩,或将长期运行的代码封装在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
(没有执行清理。)