use*_*281 7 java multithreading
我有在linux中运行的J2SE应用程序.我已停止应用程序脚本,我正在杀死J2SE pid.这个J2SE应用程序有6个无限运行的用户线程,它们将轮询后端数据库中的某些特定记录.
当这个java pid被杀死时,我需要为每个长时间运行的线程执行一些清理操作,比如连接到DB并设置正在进行中的某些事务的状态为空.
有没有办法在每个线程中编写一个方法,JVM将在线程停止时调用该方法.
您始终可以尝试使用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.");
}
}
Run Code Online (Sandbox Code Playgroud)
使用Ctrl-C中断时的输出:
worknig...
worknig...
worknig...
^CShutting down...
cleaning up.
Run Code Online (Sandbox Code Playgroud)
杀戮时输出 kill pid
worknig...
worknig...
worknig...
worknig...
Shutting down...
cleaning up.
Run Code Online (Sandbox Code Playgroud)
杀戮时输出 kill -9 pid
worknig...
worknig...
worknig...
worknig...
worknig...
Killed
Run Code Online (Sandbox Code Playgroud)
(没有执行清理.)