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

use*_*281 7 java multithreading

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

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

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

aio*_*obe 8

您始终可以尝试使用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)

(没有执行清理.)