--- jsr166/src/test/tck/ScheduledExecutorTest.java 2017/05/29 22:44:27 1.94 +++ jsr166/src/test/tck/ScheduledExecutorTest.java 2021/01/26 13:33:06 1.99 @@ -66,13 +66,13 @@ public class ScheduledExecutorTest exten try (PoolCleaner cleaner = cleaner(p)) { final long startTime = System.nanoTime(); final CountDownLatch done = new CountDownLatch(1); - Callable task = new CheckedCallable() { + Callable task = new CheckedCallable() { public Boolean realCall() { done.countDown(); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); return Boolean.TRUE; }}; - Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); + Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); assertSame(Boolean.TRUE, f.get()); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); assertEquals(0L, done.getCount()); @@ -92,7 +92,7 @@ public class ScheduledExecutorTest exten done.countDown(); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); }}; - Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); + Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); await(done); assertNull(f.get(LONG_DELAY_MS, MILLISECONDS)); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); @@ -112,7 +112,7 @@ public class ScheduledExecutorTest exten done.countDown(); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); }}; - ScheduledFuture f = + ScheduledFuture f = p.scheduleAtFixedRate(task, timeoutMillis(), LONG_DELAY_MS, MILLISECONDS); await(done); @@ -134,7 +134,7 @@ public class ScheduledExecutorTest exten done.countDown(); assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); }}; - ScheduledFuture f = + ScheduledFuture f = p.scheduleWithFixedDelay(task, timeoutMillis(), LONG_DELAY_MS, MILLISECONDS); await(done); @@ -162,7 +162,7 @@ public class ScheduledExecutorTest exten final CountDownLatch done = new CountDownLatch(cycles); final Runnable task = new CheckedRunnable() { public void realRun() { done.countDown(); }}; - final ScheduledFuture periodicTask = + final ScheduledFuture periodicTask = p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS); final int totalDelayMillis = (cycles - 1) * delay; await(done, totalDelayMillis + LONG_DELAY_MS); @@ -208,7 +208,7 @@ public class ScheduledExecutorTest exten previous.set(now); done.countDown(); }}; - final ScheduledFuture periodicTask = + final ScheduledFuture periodicTask = p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS); final int totalDelayMillis = (cycles - 1) * delay; await(done, totalDelayMillis + cycles * LONG_DELAY_MS); @@ -224,110 +224,67 @@ public class ScheduledExecutorTest exten } /** - * execute(null) throws NPE + * Submitting null tasks throws NullPointerException */ - public void testExecuteNull() throws InterruptedException { + public void testNullTaskSubmission() { final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { - try { - p.execute(null); - shouldThrow(); - } catch (NullPointerException success) {} + assertNullTaskSubmissionThrowsNullPointerException(p); } } /** - * schedule(null) throws NPE + * Submitted tasks are rejected when shutdown */ - public void testScheduleNull() throws InterruptedException { + public void testSubmittedTasksRejectedWhenShutdown() throws InterruptedException { final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { - Future f = p.schedule((Callable)null, - randomTimeout(), randomTimeUnit()); - shouldThrow(); - } catch (NullPointerException success) {} - } - } + final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + final CountDownLatch threadsStarted = new CountDownLatch(p.getCorePoolSize()); + final CountDownLatch done = new CountDownLatch(1); + final Runnable r = () -> { + threadsStarted.countDown(); + for (;;) { + try { + done.await(); + return; + } catch (InterruptedException shutdownNowDeliberatelyIgnored) {} + }}; + final Callable c = () -> { + threadsStarted.countDown(); + for (;;) { + try { + done.await(); + return Boolean.TRUE; + } catch (InterruptedException shutdownNowDeliberatelyIgnored) {} + }}; - /** - * execute throws RejectedExecutionException if shutdown - */ - public void testSchedule1_RejectedExecutionException() throws InterruptedException { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { - p.shutdown(); - p.schedule(new NoOpRunnable(), - randomTimeout(), randomTimeUnit()); - shouldThrow(); - } catch (RejectedExecutionException success) { - } catch (SecurityException ok) {} - } - } + try (PoolCleaner cleaner = cleaner(p, done)) { + for (int i = p.getCorePoolSize(); i--> 0; ) { + switch (rnd.nextInt(4)) { + case 0: p.execute(r); break; + case 1: assertFalse(p.submit(r).isDone()); break; + case 2: assertFalse(p.submit(r, Boolean.TRUE).isDone()); break; + case 3: assertFalse(p.submit(c).isDone()); break; + } + } - /** - * schedule throws RejectedExecutionException if shutdown - */ - public void testSchedule2_RejectedExecutionException() throws InterruptedException { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { - p.shutdown(); - p.schedule(new NoOpCallable(), - randomTimeout(), randomTimeUnit()); - shouldThrow(); - } catch (RejectedExecutionException success) { - } catch (SecurityException ok) {} - } - } + // ScheduledThreadPoolExecutor has an unbounded queue, so never saturated. + await(threadsStarted); - /** - * schedule callable throws RejectedExecutionException if shutdown - */ - public void testSchedule3_RejectedExecutionException() throws InterruptedException { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { + if (rnd.nextBoolean()) + p.shutdownNow(); + else p.shutdown(); - p.schedule(new NoOpCallable(), - randomTimeout(), randomTimeUnit()); - shouldThrow(); - } catch (RejectedExecutionException success) { - } catch (SecurityException ok) {} - } - } + // Pool is shutdown, but not yet terminated + assertTaskSubmissionsAreRejected(p); + assertFalse(p.isTerminated()); - /** - * scheduleAtFixedRate throws RejectedExecutionException if shutdown - */ - public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { - p.shutdown(); - p.scheduleAtFixedRate(new NoOpRunnable(), - MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS); - shouldThrow(); - } catch (RejectedExecutionException success) { - } catch (SecurityException ok) {} - } - } + done.countDown(); // release blocking tasks + assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); - /** - * scheduleWithFixedDelay throws RejectedExecutionException if shutdown - */ - public void testScheduleWithFixedDelay1_RejectedExecutionException() throws InterruptedException { - final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - try (PoolCleaner cleaner = cleaner(p)) { - try { - p.shutdown(); - p.scheduleWithFixedDelay(new NoOpRunnable(), - MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS); - shouldThrow(); - } catch (RejectedExecutionException success) { - } catch (SecurityException ok) {} + assertTaskSubmissionsAreRejected(p); } + assertEquals(p.getCorePoolSize(), p.getCompletedTaskCount()); } /** @@ -592,7 +549,8 @@ public class ScheduledExecutorTest exten final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p, done)) { final CountDownLatch threadStarted = new CountDownLatch(1); - ScheduledFuture[] tasks = new ScheduledFuture[5]; + @SuppressWarnings("unchecked") + ScheduledFuture[] tasks = (ScheduledFuture[])new ScheduledFuture[5]; for (int i = 0; i < tasks.length; i++) { Runnable r = new CheckedRunnable() { public void realRun() throws InterruptedException { @@ -615,7 +573,8 @@ public class ScheduledExecutorTest exten final CountDownLatch done = new CountDownLatch(1); final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p, done)) { - ScheduledFuture[] tasks = new ScheduledFuture[5]; + @SuppressWarnings("unchecked") + ScheduledFuture[] tasks = (ScheduledFuture[])new ScheduledFuture[5]; final CountDownLatch threadStarted = new CountDownLatch(1); for (int i = 0; i < tasks.length; i++) { Runnable r = new CheckedRunnable() { @@ -643,14 +602,15 @@ public class ScheduledExecutorTest exten * purge eventually removes cancelled tasks from the queue */ public void testPurge() throws InterruptedException { - final ScheduledFuture[] tasks = new ScheduledFuture[5]; + @SuppressWarnings("unchecked") + ScheduledFuture[] tasks = (ScheduledFuture[])new ScheduledFuture[5]; final Runnable releaser = new Runnable() { public void run() { - for (ScheduledFuture task : tasks) + for (ScheduledFuture task : tasks) if (task != null) task.cancel(true); }}; final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p, releaser)) { for (int i = 0; i < tasks.length; i++) - tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(), + tasks[i] = p.schedule(possiblyInterruptedRunnable(SMALL_DELAY_MS), LONG_DELAY_MS, MILLISECONDS); int max = tasks.length; if (tasks[4].cancel(true)) --max; @@ -682,7 +642,7 @@ public class ScheduledExecutorTest exten Runnable waiter = new CheckedRunnable() { public void realRun() { threadsStarted.countDown(); try { - MILLISECONDS.sleep(2 * LONG_DELAY_MS); + MILLISECONDS.sleep(LONGER_DELAY_MS); } catch (InterruptedException success) {} ran.getAndIncrement(); }}; @@ -712,7 +672,7 @@ public class ScheduledExecutorTest exten */ public void testShutdownNow_delayedTasks() throws InterruptedException { final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); - List tasks = new ArrayList<>(); + List> tasks = new ArrayList<>(); for (int i = 0; i < 3; i++) { Runnable r = new NoOpRunnable(); tasks.add(p.schedule(r, 9, SECONDS)); @@ -720,7 +680,7 @@ public class ScheduledExecutorTest exten tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS)); } if (testImplementationDetails) - assertEquals(new HashSet(tasks), new HashSet(p.getQueue())); + assertEquals(new HashSet(tasks), new HashSet(p.getQueue())); final List queuedTasks; try { queuedTasks = p.shutdownNow(); @@ -730,9 +690,9 @@ public class ScheduledExecutorTest exten assertTrue(p.isShutdown()); assertTrue(p.getQueue().isEmpty()); if (testImplementationDetails) - assertEquals(new HashSet(tasks), new HashSet(queuedTasks)); + assertEquals(new HashSet(tasks), new HashSet(queuedTasks)); assertEquals(tasks.size(), queuedTasks.size()); - for (ScheduledFuture task : tasks) { + for (ScheduledFuture task : tasks) { assertFalse(task.isDone()); assertFalse(task.isCancelled()); } @@ -747,6 +707,7 @@ public class ScheduledExecutorTest exten * - setExecuteExistingDelayedTasksAfterShutdownPolicy * - setContinueExistingPeriodicTasksAfterShutdownPolicy */ + @SuppressWarnings("FutureReturnValueIgnored") public void testShutdown_cancellation() throws Exception { final int poolSize = 4; final ScheduledThreadPoolExecutor p @@ -846,7 +807,7 @@ public class ScheduledExecutorTest exten immediates.forEach( f -> assertTrue(((ScheduledFuture)f).getDelay(NANOSECONDS) <= 0L)); - Stream.of(immediates, delayeds, periodics).flatMap(c -> c.stream()) + Stream.of(immediates, delayeds, periodics).flatMap(Collection::stream) .forEach(f -> assertFalse(f.isDone())); try { p.shutdown(); } catch (SecurityException ok) { return; } @@ -900,7 +861,7 @@ public class ScheduledExecutorTest exten assertTrue(q.isEmpty()); - Stream.of(immediates, delayeds, periodics).flatMap(c -> c.stream()) + Stream.of(immediates, delayeds, periodics).flatMap(Collection::stream) .forEach(f -> assertTrue(f.isDone())); for (Future f : immediates) assertNull(f.get()); @@ -1330,7 +1291,7 @@ public class ScheduledExecutorTest exten p.invokeAll(tasks, timeout, MILLISECONDS); assertEquals(tasks.size(), futures.size()); assertTrue(millisElapsedSince(startTime) >= timeout); - for (Future future : futures) + for (Future future : futures) assertTrue(future.isDone()); assertTrue(futures.get(1).isCancelled()); try { @@ -1351,18 +1312,16 @@ public class ScheduledExecutorTest exten * one-shot task from executing. * https://bugs.openjdk.java.net/browse/JDK-8051859 */ + @SuppressWarnings("FutureReturnValueIgnored") public void testScheduleWithFixedDelay_overflow() throws Exception { final CountDownLatch delayedDone = new CountDownLatch(1); final CountDownLatch immediateDone = new CountDownLatch(1); final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); try (PoolCleaner cleaner = cleaner(p)) { - final Runnable immediate = new Runnable() { public void run() { - immediateDone.countDown(); - }}; - final Runnable delayed = new Runnable() { public void run() { + final Runnable delayed = () -> { delayedDone.countDown(); - p.submit(immediate); - }}; + p.submit(() -> immediateDone.countDown()); + }; p.scheduleWithFixedDelay(delayed, 0L, Long.MAX_VALUE, SECONDS); await(delayedDone); await(immediateDone);