3

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

主程序启动并启动观察者线程,在 void Main() 中,我有这条线

Runtime.getRuntime().addShutdownHook(new Thread(new ShutdownThread(), "Exit Listener"));

当我不启动观察者线程时,当我终止程序时会调用 ShutdownThread,但是当我启动其中有死循环的观察者线程时,不会调用 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()。似乎我无法在父线程中或在其本身中覆盖它。这太令人沮丧了。我正在考虑将条目放入队列中,然后在其他地方阅读。至少这可能会奏效。

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

4

1 回答 1

0

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

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

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

于 2010-02-26T11:30:22.030 回答