【问题标题】:How to notify main thread on exceptions occuring in scheduledExecutor task threads?如何在 scheduleExecutortask 线程中发生异常时通知主线程?
【发布时间】:2011-03-28 03:47:15
【问题描述】:

我在ScheduledExecutor 中有一个定期运行的任务。如果有一些特殊的例外我想归结为主线程,那么有什么干净的方法可以做到这一点?似乎没有办法从ScheduledFuture 捕获异常,如果我只是尝试在计划任务上抛出RuntimeException,该任务将停止并且永远不会被ScheduledExecutor 再次运行。

目前,我在主线程中只有一个公共静态成员,用于接收来自计划任务的事件,但这似乎并不理想。有什么推荐的读物给我看或有什么想法吗?

编辑:抱歉,请允许我举个例子:

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()。

现在,我在主类中有一个公共静态并发队列,我将异常添加到计划线程中。在 main() 中周期性地,我只是轮询队列并对队列中的任何异常做出反应。有没有更好的方法来做到这一点?

【问题讨论】:

  • 你是如何向调度器提交任务的?
  • 另外,“主线程”是什么意思。这是什么类型的应用程序?
  • 您将如何处理异常?

标签: java multithreading


【解决方案1】:

通过队列将异常传递回另一个线程似乎是一件非常合理的事情。正如洞察者所说,另一种方法是使用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 
    }
}

【讨论】:

    【解决方案2】:
    Thread.setDefaultUncaughtExceptionHandler
    

    【讨论】:

    • 这不是特别有用。也许您愿意详细说明?
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2013-03-13
    相关资源
    最近更新 更多