From 898f961766cb875cd7cedda20776a3ce751c06ee Mon Sep 17 00:00:00 2001 From: Fadelis Date: Fri, 15 Jan 2021 23:19:35 +0100 Subject: [PATCH] adds support for simple Executor --- .../net/jodah/failsafe/FailsafeExecutor.java | 2 +- .../internal/util/DelegatingScheduler.java | 30 +++++++++++-------- .../failsafe/util/concurrent/Scheduler.java | 2 +- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/jodah/failsafe/FailsafeExecutor.java b/src/main/java/net/jodah/failsafe/FailsafeExecutor.java index 5d0086d4..645e6402 100644 --- a/src/main/java/net/jodah/failsafe/FailsafeExecutor.java +++ b/src/main/java/net/jodah/failsafe/FailsafeExecutor.java @@ -345,7 +345,7 @@ public FailsafeExecutor with(ScheduledExecutorService executor) { * * @throws NullPointerException if {@code executor} is null */ - public FailsafeExecutor with(ExecutorService executor) { + public FailsafeExecutor with(Executor executor) { this.scheduler = Scheduler.of(executor); return this; } diff --git a/src/main/java/net/jodah/failsafe/internal/util/DelegatingScheduler.java b/src/main/java/net/jodah/failsafe/internal/util/DelegatingScheduler.java index 67357782..2b821e97 100644 --- a/src/main/java/net/jodah/failsafe/internal/util/DelegatingScheduler.java +++ b/src/main/java/net/jodah/failsafe/internal/util/DelegatingScheduler.java @@ -37,14 +37,14 @@ public final class DelegatingScheduler implements Scheduler { private static volatile ForkJoinPool FORK_JOIN_POOL; private static volatile ScheduledThreadPoolExecutor DELAYER; - private final ExecutorService executorService; + private final Executor executor; private DelegatingScheduler() { - this.executorService = null; + this.executor = null; } - public DelegatingScheduler(ExecutorService executor) { - this.executorService = executor; + public DelegatingScheduler(Executor executor) { + this.executor = executor; } private static final class DelayerThreadFactory implements ThreadFactory { @@ -108,9 +108,9 @@ private static ScheduledExecutorService delayer() { return DELAYER; } - private ExecutorService executorService() { - if (executorService != null) - return executorService; + private Executor executor() { + if (executor != null) + return executor; if (FORK_JOIN_POOL == null) { synchronized (DelegatingScheduler.class) { if (FORK_JOIN_POOL == null) { @@ -128,12 +128,12 @@ private ExecutorService executorService() { @SuppressWarnings("unchecked") public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { ScheduledCompletableFuture promise = new ScheduledCompletableFuture<>(delay, unit); - ExecutorService es = executorService(); - boolean isForkJoinPool = es instanceof ForkJoinPool; + Executor e = executor(); + boolean isForkJoinPool = e instanceof ForkJoinPool; Callable completingCallable = () -> { try { if (isForkJoinPool) { - // Guard against race with promise.cancel + // Guard against race with promise.cancel synchronized (promise) { promise.forkJoinPoolThread = Thread.currentThread(); } @@ -151,16 +151,22 @@ public ScheduledFuture schedule(Callable callable, long delay, TimeUnit un }; if (delay == 0) - promise.delegate = es.submit(completingCallable); + promise.delegate = submit(e, completingCallable); else promise.delegate = delayer().schedule(() -> { // Guard against race with promise.cancel synchronized (promise) { if (!promise.isCancelled()) - promise.delegate = es.submit(completingCallable); + promise.delegate = submit(e, completingCallable); } }, delay, unit); return promise; } + + private static Future submit(Executor executor, Callable callable) { + FutureTask future = new FutureTask<>(callable); + executor.execute(future); + return future; + } } \ No newline at end of file diff --git a/src/main/java/net/jodah/failsafe/util/concurrent/Scheduler.java b/src/main/java/net/jodah/failsafe/util/concurrent/Scheduler.java index 4fa5058f..723bea8d 100644 --- a/src/main/java/net/jodah/failsafe/util/concurrent/Scheduler.java +++ b/src/main/java/net/jodah/failsafe/util/concurrent/Scheduler.java @@ -53,7 +53,7 @@ static Scheduler of(final ScheduledExecutorService executor) { * * @throws NullPointerException if {@code executor} is null */ - static Scheduler of(final ExecutorService executor) { + static Scheduler of(final Executor executor) { return new DelegatingScheduler(Assert.notNull(executor, "executor")); } }