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”,因为它不能被杀死。:-)