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();
}
}
@杰夫是正确的
。。。它将被某个人错误地摧毁
线程不会被“杀死”或“破坏”。他们因自己采取的行动而终止。线程终止的两种情况是:
方法返回。这通常是通过设计实现的;i、 因为这个方法已经完成了它设计要做的任何事情run()
方法引发或传播异常。这通常是由于线程中的某些错误引发意外的未检查异常而导致的run()
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
}
}