Java 当一根线被破坏时,如何连接

Java 当一根线被破坏时,如何连接,java,multithreading,Java,Multithreading,当线程被终止时,有什么地方可以连接吗?比如: onDestroy{ //do something... } 编辑: 很抱歉我应该说得更清楚些 线程终止不是因为所有作业都已完成,而是因为客户端代码使用ThreadGroup.destroy()终止了该作业。由于我的singleton在客户机代码中被实例化,因此它将属于客户机代码的THreadGroup,并因此被终止。(实际上,我对最后一句话不是很确定…没有通用的方法向线程添加异步侦听器,该线程在线程死亡时会收到通知。您可以使用join方法等待线

当线程被终止时,有什么地方可以连接吗?比如:

onDestroy{
 //do something...
}
编辑: 很抱歉我应该说得更清楚些


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

没有通用的方法向线程添加异步侦听器,该线程在线程死亡时会收到通知。您可以使用
join
方法等待线程,但这是同步的。或者您可以创建thread类的扩展,该扩展在其run方法的末尾调用侦听器,类似于:

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

     protected abstract void doRun();

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

}
public抽象类NotifyingThread扩展线程{
私人最终听众名单;
受保护的抽象void doRun();
公开募捐{
多伦();
notifyListeners();
}
}
@杰夫是正确的

。。。它将被某个人错误地摧毁

线程不会被“杀死”或“破坏”。他们因自己采取的行动而终止。线程终止的两种情况是:

  • run()
    方法返回。这通常是通过设计实现的;i、 因为这个方法已经完成了它设计要做的任何事情

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

(我忽略了一些JVM可能实现不推荐的
Thread.destroy()
方法的可能性,有人可能会疯狂地调用它。)


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

您可以这样包装动作和钩子

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();
       }
    }

}

被杀还是被打断

如果您正在监视中断线程的尝试,那么最简单的方法就是捕获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
    }
}

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

Jeff,我的线程正在while循环中运行,它将被某个人错误地销毁。我想知道这一点,并在它被销毁后启动另一个线程。@jeff,“试试{run();}最后{notifyListeners();}”怎么样?@pierr,你说它会被人错误地销毁是什么意思?@jeff,我的电子邮件中的一个懒拷贝来解释:“到目前为止,我们取消了在Xlet线程组中创建的所有线程。这似乎是您的情况,因为您的单例正在Xlet的类装入器/线程组中实例化。“这不像其他人在你的代码中走动,终止你的线程。听起来他们好像在执行应用程序中的功能,导致线程被终止。作为开发人员,您的工作是构建程序,以便在触发此“错误”功能时调用您想要的代码,和/或首先防止错误终止。我想知道是否有什么通过?什么?请参阅方法“destroy()。它清楚地表示“线程组必须为空,表示所有线程都已停止”=>这意味着它不会杀死任何线程。也许您最好向我们描述一下您试图实现的目标。你想让你的单身汉怎么样?为什么要终止线程?@ignis,我正在试图找到一种方法,防止我的线程被终止,或者设置标志,以便稍后创建另一个线程。
// 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
    }
}