如何通知主线程在scheduledExecutortask线程中发生的异常?

时间:2011-03-28 03:47:15

标签: java multithreading

我在ScheduledExecutor内定期执行任务。如果有一些特殊的例外我想要归结为主线程,那么干净的方法是什么?似乎没有办法从ScheduledFuture捕获异常,如果我只是尝试在计划任务上抛出RuntimeException,那么该任务将停止并且永远不会再由ScheduledExecutor运行{1}}。

目前,我在主线程中只有一个公共静态成员,用于接收来自计划任务的事件,但这似乎不太理想。我建议阅读或任何想法?

编辑:道歉,请允许我通过一个例子展开:

public class TestScheduledFuture {

    public static void main(String[] args) {
        ScheduledExecutorService taskScheduler = Executors.newSingleThreadScheduledExecutor();
        ScheduledFuture<?> scheduledFuture = taskScheduler.scheduleAtFixedRate(new TestScheduledTask(),2,2, TimeUnit.SECONDS);
    }
}

我的目标是如果在TestScheduledTask()中遇到RuntimeException,只需在main()中抛出一个RuntimeException()。

现在,我在主类中有一个public static concurrentQueue,我从预定的线程中添加了异常。在main()中的perioidically我只是轮询队列并对队列中的任何异常作出反应。有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

通过队列将异常传回另一个线程似乎是完全合理的事情。另一种选择是,正如明白所说,使用Thread.setUncaughtExceptionHandler,否则ExecutorService无法处理异常。要使用它,您需要在创建时提供ThreadFactory,类似这样的

class MyThreadFactory implements ThreadFactory {
    private final ThreadFactory DEFAULT_THREAD_FACTORY = Executors.defaultThreadFactory();

    public Thread newThread(Runnable r) {
        Thread thread = DEFAULT_THREAD_FACTORY.newThread(r);
        thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
        return thread;
    }
};


class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    public void uncaughtException(Thread t, Throwable e) {
        // give this a reference to main so it can call some method to pass e and t back 
    }
}

答案 1 :(得分:0)

Thread.setDefaultUncaughtExceptionHandler