gpt4 book ai didi

java - 调度的Executor任务线程发生异常如何通知主线程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:26:18 24 4
gpt4 key购买 nike

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

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

编辑:抱歉,请允许我举例说明:

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() 中周期性地轮询队列并对队列中的任何异常使用react。有更好的方法吗?

最佳答案

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

关于java - 调度的Executor任务线程发生异常如何通知主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com