Java newSingleThreadscheduledExecutor
我有个问题。我有一些代码如下所示:Java newSingleThreadscheduledExecutor,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有个问题。我有一些代码如下所示: executor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Exec")); [...] executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { // my task ... }, 1, 1, TimeUnit.MINUTES); 每隔一段时间,上述任务就会遇到问题并
executor = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("Exec"));
[...]
executor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// my task
...
}, 1, 1, TimeUnit.MINUTES);
每隔一段时间,上述任务就会遇到问题并崩溃。newSingleThreadScheduledExecutor有一个有趣的特性:它会无声地死去,不再执行任务
我需要改变这种行为。换句话说,即使run()遇到RuntimeException,我也希望任务继续以固定速率执行
我该怎么做
我需要改变这种行为。换句话说,即使run()遇到RuntimeException,我也希望任务继续以固定速率执行
最简单的方法是创建一个包装器Runnable
:
public final class ExceptionSwallowingRunnable implements Runnable {
private final Runnable delegate;
public ExceptionSwallowingRunnable(Runnable delegate) {
// TODO: Argument validation
this.delegate = delegate;
}
@Override public void run() {
try {
delegate.run();
} catch (RuntimeException e) {
// Logging etc
}
}
}
然后在计划执行器中运行它,包装真正的任务。请注意,如果您真的想捕获所有内容,那么您可能会捕获可丢弃的
,但我不建议这样做
也许有另一种方法,但这是我能想到的最简单的方法,无需进一步研究:)合理的想法。我想知道是否有人写了一个ExecutorService,总是这样包装Runnable?称它为“JasonExecutorService”,因为它不能被杀死。:-)