addShutdownHook和setUncaughtExceptionHandler不';在java中无法按预期工作

addShutdownHook和setUncaughtExceptionHandler不';在java中无法按预期工作,java,multithreading,exception-handling,shutdown,Java,Multithreading,Exception Handling,Shutdown,我有一个多线程程序,其中我有一个线程来监视多个线程。功能设计如下: 主程序执行初始化并启动观察线程,在void Main()中,我有一行 Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownThread(), "Exit Listener")); 当我没有启动watcher线程时,当我终止程序时会调用ShutdownThread,但是当我启动了包含死循环的watcher线程时,ShutdownThread不会被调用(我在该线程

我有一个多线程程序,其中我有一个线程来监视多个线程。功能设计如下:

主程序执行初始化并启动观察线程,在void Main()中,我有一行

Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownThread(), "Exit Listener"));
当我没有启动watcher线程时,当我终止程序时会调用ShutdownThread,但是当我启动了包含死循环的watcher线程时,ShutdownThread不会被调用(我在该线程中打印一条消息)。这很奇怪。有什么解释吗

观察者线程类似于:

public void run(){
   boolean running=false;
   thread a=new thread(...); //Do the same thing for b, c, d...
   while(true){
   if (a.isActive()){
     if (running)
        thread a= new thread(...);
     a.start();
     running=true;
   }
   Thread.sleep(1000); //try catch block...
}
我想要的是一个优雅的关闭,即在收到终止信号后,运行shutdownThread,设置一个标志并中断所有线程,然后等待线程中断它,或者等待它超时,以便杀死剩余的线程。所有线程都可以捕获中断,并检查是否设置了标志,如果设置了,它将中断shutdownThread,然后退出自身。相反,我看到的是,所有线程都在自行终止,根本不进行清理

使用信号怎么样?有什么好的跨平台代码吗

然后,setUncaughtExceptionHandler也不工作。我做了测试,发现根本没有调用处理程序。我不知道为什么。处理程序的代码是:

    public static class ErrHandler implements Thread.UncaughtExceptionHandler{
    public final void uncaughtException(Thread t, Throwable e) {
            Error(t + "died, threw exception: " + e);
        }
    }//this is in public class globals
我用钩子钩住它

producer.setUncaughtExceptionHandler(Globals.errhandler);
在我的代码中,我只看到原始的e.printStack()。似乎我无法覆盖它,无论是在父线程中,还是在它本身。这太令人沮丧了。我正在考虑将一个条目放入队列,然后在其他地方读取它。至少这可能行得通


哦,整个目的是确保如果任何线程由于运行时异常而死亡,观察线程将检查异常是否足够致命,并决定重新启动该线程或完全退出。同时,我希望程序在用户结束时优雅地结束(向保存线程发送一个中断,以便它转储结果,然后再中断回来,告诉用户我们准备退出)

不知道这是否对你有帮助,但我们遇到了同样的行为。 并非所有异常都正确路由到注册的ExceptionHandler

我想知道并发框架是否存在单元测试。因为这必须被检测到

我们通过使用ScheduledExecutorService实例作为委托自行实现ScheduledExecutorService,并将每个方法的参数Runnable/Callable封装在Runnable/Callable实现中,从而纠正了这种行为