static Disposable workerSchedule(ScheduledExecutorService exec, Disposable.Composite tasks, Runnable task, long delay, TimeUnit unit) { WorkerTask sr = new WorkerTask(task, tasks); if (!tasks.add(sr)) { throw Exceptions.failWithRejected(); } try { Future<?> f; if (delay <= 0L) { f = exec.submit((Callable<?>) sr); } else { f = exec.schedule((Callable<?>) sr, delay, unit); } sr.setFuture(f); } catch (RejectedExecutionException ex) { sr.dispose(); //RejectedExecutionException are propagated up throw ex; } return sr; }
@Test public void withFutureDisposed() { WorkerTask run = new WorkerTask(() -> {}, null); run.setFuture(new FutureTask<Void>(() -> {}, null)); run.dispose(); run.call(); }
@Test public void withFutureDisposed2() { WorkerTask run = new WorkerTask(() -> {}, null); run.dispose(); run.setFuture(new FutureTask<Void>(() -> {}, null)); run.call(); }
@Test public void withFutureDisposed3() { WorkerTask run = new WorkerTask(() -> {}, null); run.dispose(); WorkerTask.THREAD.set(run, Thread.currentThread()); run.setFuture(new FutureTask<Void>(() -> {}, null)); run.call(); }
while (sync.get() != 0) { } run.setFuture(ft); if (syncb.decrementAndGet() != 0) { while (syncb.get() != 0) { }
@Test public void runFuture() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Void> ft = new FutureTask<>(() -> { }, null); Runnable r1 = run::call; Runnable r2 = () -> run.setFuture(ft); RaceTestUtils.race(r1, r2); } }
@Test public void setFutureRunRace() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Object> ft = new FutureTask<>(() -> { }, 0); Runnable r1 = () -> run.setFuture(ft); Runnable r2 = run::run; RaceTestUtils.race(r1, r2); assertThat(set.size()).isZero(); } }
@Test public void setFutureCancelRace() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Object> ft = new FutureTask<>(() -> { }, 0); Runnable r1 = () -> run.setFuture(ft); Runnable r2 = run::dispose; RaceTestUtils.race(r1, r2); assertThat(set.size()).isZero(); } }
static Disposable workerSchedule(ScheduledExecutorService exec, Disposable.Composite tasks, Runnable task, long delay, TimeUnit unit) { WorkerTask sr = new WorkerTask(task, tasks); if (!tasks.add(sr)) { throw Exceptions.failWithRejected(); } try { Future<?> f; if (delay <= 0L) { f = exec.submit((Callable<?>) sr); } else { f = exec.schedule((Callable<?>) sr, delay, unit); } sr.setFuture(f); } catch (RejectedExecutionException ex) { sr.dispose(); //RejectedExecutionException are propagated up throw ex; } return sr; }