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

时间:2010-05-08 06:31:50

标签: java multithreading

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

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

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

1 个答案:

答案 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

(没有执行清理。)