我在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我只是轮询队列并对队列中的任何异常作出反应。有更好的方法吗?
答案 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