如何挂钩线程被破坏的时刻

时间:2011-06-03 01:00:13

标签: java multithreading

线程被杀死时是否有任何地方可以连接?类似的东西:

onDestroy{
 //do something...
}

编辑: 抱歉。我应该更明确地说明。

线程终止不是因为所有作业都已完成,而是因为它已被使用ThreadGroup.destroy()的客户端代码终止。由于我的单例在客户端代码中被实例化,因此它将属于客户端代码的THreadGroup并因此被终止。 (实际上,我不太确定最后一句......)

5 个答案:

答案 0 :(得分:7)

你可以像这样包装动作和钩子。

public final class HookOnDestroy implements Runnable {
    private final Runnable action;
    private final Runnable hook;
    public HookOnDestroy(Runnable action, Runnable hook) {
          this.hook = hook;
          this.action = action;
    }

    @Override
    public void run() {
       try {
         action.run();
       } finally {
         hook.run();
       }
    }

}

Runnable action = ...
Runnable hook = ...
new Thread( new HookOnDestroy(action,hook)).start();

答案 1 :(得分:5)

没有通用的方法将异步侦听器添加到线程死亡时获得通知的线程。您可以使用join方法等待线程,但这是同步的。或者,您可以创建一个线程类的扩展,在其run方法的末尾调用侦听器,如:

public abstract class NotifyingThread extends Thread {
     private final List<ThreadListeners> listeners;

     protected abstract void doRun();

     public void run() {
         doRun();
         notifyListeners();
     }

}

答案 2 :(得分:3)

被杀或中断?

如果您正在尝试中断线程,最简单的方法是捕获InterruptedException。在超伪代码中:

// in my Thread
public void run() {
    try {
        boolean keepRunning = true;
        while (keepRunning) {
            // Do useful work
            // Call other methods
            // As long as they aren't also catching InterruptedException
        }
        System.err.println("Finished running since keepRunning is now false");
    } catch (InterrruptedException ie) {
        // This is where you would put your "onDestroy" functionality
    }
}

答案 3 :(得分:2)

@Jeff是对的。

  

......它会被一些人误导。

线程不会被“杀死”或“被破坏”。它们由于自己采取行动而终止。线程终止的两个场景是:

  • run()方法返回。这通常是通过设计实现的;因为该方法已经完成了它的设计目的。

  • run()方法抛出或传播异常。这通常是由于线程中的某些错误导致意外的未经检查的异常而发生的。

(我忽略了某些JVM可能会实现已弃用的Thread.destroy()方法的可能性,并且有人可能会疯狂到可以调用它。)

这并不是说监视线程终止不是一件有用的事情。只是因为线程终止的原因与您在问题/评论中假设的不同。

答案 4 :(得分:0)

也许你可以在不同的线程组中启动一个线程。因此,您的代码不会在Xlet线程组中运行,因此它们将无法终止该线程。