18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes, 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd. 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS; 12b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport static java.util.concurrent.TimeUnit.NANOSECONDS; 13b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport static java.util.concurrent.TimeUnit.SECONDS; 148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.ArrayList; 16b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.HashSet; 178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.List; 188e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.BlockingQueue; 198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Callable; 20b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.CancellationException; 218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.CountDownLatch; 228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException; 238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Executors; 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutorService; 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Future; 268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.RejectedExecutionException; 278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledFuture; 288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ScheduledThreadPoolExecutor; 298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadFactory; 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ThreadPoolExecutor; 31b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicBoolean; 328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger; 33b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.concurrent.atomic.AtomicLong; 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ScheduledExecutorTest extends JSR166TestCase { 398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Removed because the CTS runner does a bad job of 408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // retrying tests that have suite() declarations. 418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 448e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 46b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // return new TestSuite(ScheduledExecutorTest.class); 478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * execute successfully executes a runnable 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testExecute() throws InterruptedException { 53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 54b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 55b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 56b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable task = new CheckedRunnable() { 57b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void realRun() { done.countDown(); }}; 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(task); 59b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS)); 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * delayed schedule of callable successfully executes after delay 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule1() throws Exception { 67b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 68b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 69b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 70b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Callable task = new CheckedCallable<Boolean>() { 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public Boolean realCall() { 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return Boolean.TRUE; 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(Boolean.TRUE, f.get()); 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(done.await(0L, MILLISECONDS)); 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * delayed schedule of runnable successfully executes after delay 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule3() throws Exception { 88b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 89b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 90b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 91b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable task = new CheckedRunnable() { 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future f = p.schedule(task, timeoutMillis(), MILLISECONDS); 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(done); 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.get(LONG_DELAY_MS, MILLISECONDS)); 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * scheduleAtFixedRate executes runnable after given initial delay 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule4() throws Exception { 108b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 109b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 110b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 111b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable task = new CheckedRunnable() { 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ScheduledFuture f = 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.scheduleAtFixedRate(task, timeoutMillis(), 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LONG_DELAY_MS, MILLISECONDS); 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(done); 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.cancel(true); 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * scheduleWithFixedDelay executes runnable after given initial delay 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule5() throws Exception { 130b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 131b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 132b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 133b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable task = new CheckedRunnable() { 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ScheduledFuture f = 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.scheduleWithFixedDelay(task, timeoutMillis(), 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle LONG_DELAY_MS, MILLISECONDS); 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(done); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.cancel(true); 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static class RunnableCounter implements Runnable { 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicInteger count = new AtomicInteger(0); 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void run() { count.getAndIncrement(); } 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 154b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * scheduleAtFixedRate executes series of tasks at given rate. 155b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Eventually, it must hold that: 156b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * cycles - 1 <= elapsedMillis/delay < cycles 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testFixedRateSequence() throws InterruptedException { 159b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 160b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 1618e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { 162b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 163b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int cycles = 8; 1648e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath final CountDownLatch done = new CountDownLatch(cycles); 165b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable task = new CheckedRunnable() { 1668e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void realRun() { done.countDown(); }}; 167b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledFuture periodicTask = 1688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath p.scheduleAtFixedRate(task, 0, delay, MILLISECONDS); 169b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int totalDelayMillis = (cycles - 1) * delay; 170b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done, totalDelayMillis + LONG_DELAY_MS); 171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak periodicTask.cancel(true); 172b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long elapsedMillis = millisElapsedSince(startTime); 173b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(elapsedMillis >= totalDelayMillis); 174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (elapsedMillis <= cycles * delay) 1758e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath return; 176b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // else retry with longer delay 1778e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 178b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak fail("unexpected execution rate"); 1798e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 183b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * scheduleWithFixedDelay executes series of tasks with given period. 184b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Eventually, it must hold that each task starts at least delay and at 185b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * most 2 * delay after the termination of the previous task. 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testFixedDelaySequence() throws InterruptedException { 188b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 1908e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath for (int delay = 1; delay <= LONG_DELAY_MS; delay *= 3) { 191b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long startTime = System.nanoTime(); 192b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AtomicLong previous = new AtomicLong(startTime); 193b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AtomicBoolean tryLongerDelay = new AtomicBoolean(false); 194b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int cycles = 8; 1958e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath final CountDownLatch done = new CountDownLatch(cycles); 196b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int d = delay; 197b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable task = new CheckedRunnable() { 198b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void realRun() { 199b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long now = System.nanoTime(); 200b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long elapsedMillis 201b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak = NANOSECONDS.toMillis(now - previous.get()); 202b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (done.getCount() == cycles) { // first execution 203b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (elapsedMillis >= d) 204b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tryLongerDelay.set(true); 205b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } else { 206b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(elapsedMillis >= d); 207b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (elapsedMillis >= 2 * d) 208b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tryLongerDelay.set(true); 209b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 210b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak previous.set(now); 211b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak done.countDown(); 212b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 213b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledFuture periodicTask = 2148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath p.scheduleWithFixedDelay(task, 0, delay, MILLISECONDS); 215b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int totalDelayMillis = (cycles - 1) * delay; 216b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done, totalDelayMillis + cycles * LONG_DELAY_MS); 217b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak periodicTask.cancel(true); 218b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final long elapsedMillis = millisElapsedSince(startTime); 219b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(elapsedMillis >= totalDelayMillis); 220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (!tryLongerDelay.get()) 2218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath return; 222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // else retry with longer delay 2238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 224b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak fail("unexpected execution rate"); 2258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * execute(null) throws NPE 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testExecuteNull() throws InterruptedException { 232b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 233b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 234b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.execute(null); 236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * schedule(null) throws NPE 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testScheduleNull() throws InterruptedException { 245b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 246b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak TrackedCallable callable = null; 249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Future f = p.schedule(callable, SHORT_DELAY_MS, MILLISECONDS); 250b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * execute throws RejectedExecutionException if shutdown 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule1_RejectedExecutionException() throws InterruptedException { 259b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 260b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 261b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 262b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 263b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.schedule(new NoOpRunnable(), 264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MILLISECONDS); 265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RejectedExecutionException success) { 267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) {} 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * schedule throws RejectedExecutionException if shutdown 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule2_RejectedExecutionException() throws InterruptedException { 275b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 276b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 277b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 278b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 279b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.schedule(new NoOpCallable(), 280b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MILLISECONDS); 281b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 282b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RejectedExecutionException success) { 283b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) {} 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * schedule callable throws RejectedExecutionException if shutdown 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSchedule3_RejectedExecutionException() throws InterruptedException { 291b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 293b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 294b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.schedule(new NoOpCallable(), 296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MILLISECONDS); 297b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 298b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RejectedExecutionException success) { 299b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) {} 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * scheduleAtFixedRate throws RejectedExecutionException if shutdown 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testScheduleAtFixedRate1_RejectedExecutionException() throws InterruptedException { 307b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 308b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 309b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 310b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 311b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.scheduleAtFixedRate(new NoOpRunnable(), 312b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS); 313b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 314b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RejectedExecutionException success) { 315b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) {} 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * scheduleWithFixedDelay throws RejectedExecutionException if shutdown 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testScheduleWithFixedDelay1_RejectedExecutionException() throws InterruptedException { 323b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 324b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 325b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 326b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.shutdown(); 327b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.scheduleWithFixedDelay(new NoOpRunnable(), 328b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MEDIUM_DELAY_MS, MILLISECONDS); 329b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 330b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RejectedExecutionException success) { 331b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) {} 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getActiveCount increases but doesn't overestimate, when a 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * thread becomes active 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetActiveCount() throws InterruptedException { 340ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 341b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2); 342b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 343b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getActiveCount()); 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getActiveCount()); 349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 351b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getActiveCount()); 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getCompletedTaskCount increases, but doesn't overestimate, 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * when tasks complete 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetCompletedTaskCount() throws InterruptedException { 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(2); 362b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 363b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 364b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadProceed = new CountDownLatch(1); 365b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadDone = new CountDownLatch(1); 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getCompletedTaskCount()); 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getCompletedTaskCount()); 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadProceed.await(); 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadDone.countDown(); 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(threadStarted); 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getCompletedTaskCount()); 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadProceed.countDown(); 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadDone.await(); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (p.getCompletedTaskCount() != 1) { 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (millisElapsedSince(startTime) > LONG_DELAY_MS) 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle fail("timed out"); 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getCorePoolSize returns size given in constructor if not otherwise set 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetCorePoolSize() throws InterruptedException { 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 392b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 393b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, p.getCorePoolSize()); 394b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getLargestPoolSize increases, but doesn't overestimate, when 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * multiple threads active 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetLargestPoolSize() throws InterruptedException { 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final int THREADS = 3; 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(THREADS); 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadsStarted = new CountDownLatch(THREADS); 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 406b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getLargestPoolSize()); 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < THREADS; i++) 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadsStarted.countDown(); 412b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(THREADS, p.getLargestPoolSize()); 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 415b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadsStarted); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(THREADS, p.getLargestPoolSize()); 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 418b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(THREADS, p.getLargestPoolSize()); 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getPoolSize increases, but doesn't overestimate, when threads 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * become active 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetPoolSize() throws InterruptedException { 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 429b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getPoolSize()); 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getPoolSize()); 435b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 437b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, p.getPoolSize()); 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getTaskCount increases, but doesn't overestimate, when tasks 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * submitted 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetTaskCount() throws InterruptedException { 447b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int TASKS = 3; 448ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 449b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 450b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 451b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, p.getTaskCount()); 453b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getCompletedTaskCount()); 454b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.execute(new CheckedRunnable() { 455b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void realRun() throws InterruptedException { 456b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak threadStarted.countDown(); 457b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 458b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}); 459b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 460b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, p.getTaskCount()); 461b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getCompletedTaskCount()); 462b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (int i = 0; i < TASKS; i++) { 463b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1 + i, p.getTaskCount()); 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 467b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1 + TASKS, p.getTaskCount()); 468b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 470b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 471b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1 + TASKS, p.getTaskCount()); 472b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getCompletedTaskCount()); 4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 474b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1 + TASKS, p.getTaskCount()); 475b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1 + TASKS, p.getCompletedTaskCount()); 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getThreadFactory returns factory in constructor if not set 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetThreadFactory() throws InterruptedException { 482b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ThreadFactory threadFactory = new SimpleThreadFactory(); 483b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = 484b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak new ScheduledThreadPoolExecutor(1, threadFactory); 485b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 486b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertSame(threadFactory, p.getThreadFactory()); 487b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * setThreadFactory sets the thread factory returned by getThreadFactory 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSetThreadFactory() throws InterruptedException { 494b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ThreadFactory threadFactory = new SimpleThreadFactory(); 495b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 496b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 497b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.setThreadFactory(threadFactory); 498b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertSame(threadFactory, p.getThreadFactory()); 499b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * setThreadFactory(null) throws NPE 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSetThreadFactoryNull() throws InterruptedException { 506b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 507b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 508b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 509b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.setThreadFactory(null); 510b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 511b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isShutdown is false before shutdown, true after 5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIsShutdown() { 5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 520b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isShutdown()); 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle finally { 5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { p.shutdown(); } catch (SecurityException ok) { return; } 5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.isShutdown()); 5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isTerminated is false before termination, true after 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIsTerminated() throws InterruptedException { 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 535b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 536b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 537b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 538b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminated()); 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminated()); 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 543b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 545b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { p.shutdown(); } catch (SecurityException ok) { return; } 549b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 550b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isTerminating is not true when running or when terminated 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testIsTerminating() throws InterruptedException { 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch threadStarted = new CountDownLatch(1); 5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 561b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.execute(new CheckedRunnable() { 5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 567b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 569b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.isTerminating()); 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.countDown(); 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { p.shutdown(); } catch (SecurityException ok) { return; } 573b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 574b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 575b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminating()); 5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getQueue returns the work queue, which contains queued tasks 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetQueue() throws InterruptedException { 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch done = new CountDownLatch(1); 584b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 585b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 586b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ScheduledFuture[] tasks = new ScheduledFuture[5]; 5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < tasks.length; i++) { 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 592b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle tasks[i] = p.schedule(r, 1, MILLISECONDS); 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 596b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BlockingQueue<Runnable> q = p.getQueue(); 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains(tasks[tasks.length - 1])); 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains(tasks[0])); 6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * remove(task) removes queued task, and fails to remove active task 6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testRemove() throws InterruptedException { 607ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 608b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 609b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 610b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ScheduledFuture[] tasks = new ScheduledFuture[5]; 611b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadStarted = new CountDownLatch(1); 6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < tasks.length; i++) { 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Runnable r = new CheckedRunnable() { 6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws InterruptedException { 6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle threadStarted.countDown(); 616b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(done); 6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle tasks[i] = p.schedule(r, 1, MILLISECONDS); 6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 620b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadStarted); 6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BlockingQueue<Runnable> q = p.getQueue(); 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.remove((Runnable)tasks[0])); 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains((Runnable)tasks[4])); 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains((Runnable)tasks[3])); 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.remove((Runnable)tasks[4])); 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(p.remove((Runnable)tasks[4])); 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains((Runnable)tasks[4])); 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(q.contains((Runnable)tasks[3])); 6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(p.remove((Runnable)tasks[3])); 6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(q.contains((Runnable)tasks[3])); 6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * purge eventually removes cancelled tasks from the queue 6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPurge() throws InterruptedException { 638b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledFuture[] tasks = new ScheduledFuture[5]; 639b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable releaser = new Runnable() { public void run() { 640b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (ScheduledFuture task : tasks) 641b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (task != null) task.cancel(true); }}; 642b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 643b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, releaser)) { 644b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (int i = 0; i < tasks.length; i++) 645b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks[i] = p.schedule(new SmallPossiblyInterruptedRunnable(), 646b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak LONG_DELAY_MS, MILLISECONDS); 6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int max = tasks.length; 6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (tasks[4].cancel(true)) --max; 6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (tasks[3].cancel(true)) --max; 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // There must eventually be an interference-free point at 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // which purge will not fail. (At worst, when queue is empty.) 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle do { 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.purge(); 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long count = p.getTaskCount(); 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (count == max) 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return; 658b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } while (millisElapsedSince(startTime) < LONG_DELAY_MS); 6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle fail("Purge failed to remove cancelled tasks"); 6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 664b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * shutdownNow returns a list containing tasks that were not run, 665b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * and those tasks are drained from the queue 6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 667b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void testShutdownNow() throws InterruptedException { 668b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int poolSize = 2; 669b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int count = 5; 670b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AtomicInteger ran = new AtomicInteger(0); 671b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = 672b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak new ScheduledThreadPoolExecutor(poolSize); 673b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch threadsStarted = new CountDownLatch(poolSize); 674b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Runnable waiter = new CheckedRunnable() { public void realRun() { 675b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak threadsStarted.countDown(); 676b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 677b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MILLISECONDS.sleep(2 * LONG_DELAY_MS); 678b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (InterruptedException success) {} 679b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ran.getAndIncrement(); 680b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 681b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (int i = 0; i < count; i++) 682b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.execute(waiter); 683b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(threadsStarted); 684b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(poolSize, p.getActiveCount()); 685b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(0, p.getCompletedTaskCount()); 686b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final List<Runnable> queuedTasks; 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 688b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak queuedTasks = p.shutdownNow(); 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (SecurityException ok) { 690b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return; // Allowed in case test doesn't have privs 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 692b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isShutdown()); 693b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.getQueue().isEmpty()); 694b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(count - poolSize, queuedTasks.size()); 695b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 696b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 697b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(poolSize, ran.get()); 698b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(poolSize, p.getCompletedTaskCount()); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 702b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * shutdownNow returns a list containing tasks that were not run, 703b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * and those tasks are drained from the queue 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 705b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void testShutdownNow_delayedTasks() throws InterruptedException { 706b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 707b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<ScheduledFuture> tasks = new ArrayList<>(); 708b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (int i = 0; i < 3; i++) { 709b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Runnable r = new NoOpRunnable(); 710b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(p.schedule(r, 9, SECONDS)); 711b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(p.scheduleAtFixedRate(r, 9, 9, SECONDS)); 712b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(p.scheduleWithFixedDelay(r, 9, 9, SECONDS)); 713b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 714b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (testImplementationDetails) 715b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(new HashSet(tasks), new HashSet(p.getQueue())); 716b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final List<Runnable> queuedTasks; 717b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 718b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak queuedTasks = p.shutdownNow(); 719b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (SecurityException ok) { 720b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return; // Allowed in case test doesn't have privs 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 722ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak assertTrue(p.isShutdown()); 723b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.getQueue().isEmpty()); 724b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (testImplementationDetails) 725b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(new HashSet(tasks), new HashSet(queuedTasks)); 726b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(tasks.size(), queuedTasks.size()); 727ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak for (ScheduledFuture task : tasks) { 728b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(task.isDone()); 729ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak assertFalse(task.isCancelled()); 730ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak } 731b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 732ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 733ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak } 7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 735ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak /** 736b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * By default, periodic tasks are cancelled at shutdown. 737b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * By default, delayed tasks keep running after shutdown. 738b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * Check that changing the default values work: 739b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * - setExecuteExistingDelayedTasksAfterShutdownPolicy 740b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * - setContinueExistingPeriodicTasksAfterShutdownPolicy 741ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak */ 742b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void testShutdown_cancellation() throws Exception { 743b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Boolean[] allBooleans = { null, Boolean.FALSE, Boolean.TRUE }; 744b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Boolean policy : allBooleans) 745b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak { 746b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final int poolSize = 2; 747b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p 748b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak = new ScheduledThreadPoolExecutor(poolSize); 749b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final boolean effectiveDelayedPolicy = (policy != Boolean.FALSE); 750b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final boolean effectivePeriodicPolicy = (policy == Boolean.TRUE); 751b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final boolean effectiveRemovePolicy = (policy == Boolean.TRUE); 752b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (policy != null) { 753b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.setExecuteExistingDelayedTasksAfterShutdownPolicy(policy); 754b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.setContinueExistingPeriodicTasksAfterShutdownPolicy(policy); 755b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.setRemoveOnCancelPolicy(policy); 756b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 757b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(effectiveDelayedPolicy, 758b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.getExecuteExistingDelayedTasksAfterShutdownPolicy()); 759b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(effectivePeriodicPolicy, 760b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.getContinueExistingPeriodicTasksAfterShutdownPolicy()); 761b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(effectiveRemovePolicy, 762b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.getRemoveOnCancelPolicy()); 763b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // Strategy: Wedge the pool with poolSize "blocker" threads 764b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final AtomicInteger ran = new AtomicInteger(0); 765b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch poolBlocked = new CountDownLatch(poolSize); 766b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch unblock = new CountDownLatch(1); 767b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch periodicLatch1 = new CountDownLatch(2); 768b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch periodicLatch2 = new CountDownLatch(2); 769b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Runnable task = new CheckedRunnable() { public void realRun() 770b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak throws InterruptedException { 771b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak poolBlocked.countDown(); 772b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(unblock.await(LONG_DELAY_MS, MILLISECONDS)); 773b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ran.getAndIncrement(); 774b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 775b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<?>> blockers = new ArrayList<>(); 776b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<?>> periodics = new ArrayList<>(); 777b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<?>> delayeds = new ArrayList<>(); 778b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (int i = 0; i < poolSize; i++) 779b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak blockers.add(p.submit(task)); 780b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(poolBlocked.await(LONG_DELAY_MS, MILLISECONDS)); 781b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 782b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak periodics.add(p.scheduleAtFixedRate(countDowner(periodicLatch1), 783b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 1, 1, MILLISECONDS)); 784b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak periodics.add(p.scheduleWithFixedDelay(countDowner(periodicLatch2), 785b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 1, 1, MILLISECONDS)); 786b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak delayeds.add(p.schedule(task, 1, MILLISECONDS)); 787b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 788b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.getQueue().containsAll(periodics)); 789b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.getQueue().containsAll(delayeds)); 790ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak try { p.shutdown(); } catch (SecurityException ok) { return; } 791ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak assertTrue(p.isShutdown()); 792b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertFalse(p.isTerminated()); 793b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Future<?> periodic : periodics) { 794b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(effectivePeriodicPolicy ^ periodic.isCancelled()); 795b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(effectivePeriodicPolicy ^ periodic.isDone()); 796b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 797b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Future<?> delayed : delayeds) { 798b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(effectiveDelayedPolicy ^ delayed.isCancelled()); 799b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(effectiveDelayedPolicy ^ delayed.isDone()); 800b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 801b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (testImplementationDetails) { 802b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(effectivePeriodicPolicy, 803b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.getQueue().containsAll(periodics)); 804b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(effectiveDelayedPolicy, 805b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.getQueue().containsAll(delayeds)); 806b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 807b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // Release all pool threads 808b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak unblock.countDown(); 809ed4f365789d43b1961657195df223a19bf4ef20fPrzemyslaw Szczepaniak 810b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Future<?> delayed : delayeds) { 811b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (effectiveDelayedPolicy) { 812b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertNull(delayed.get()); 813b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 815b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (effectivePeriodicPolicy) { 816b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(periodicLatch1.await(LONG_DELAY_MS, MILLISECONDS)); 817b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(periodicLatch2.await(LONG_DELAY_MS, MILLISECONDS)); 818b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Future<?> periodic : periodics) { 819b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(periodic.cancel(false)); 820b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(periodic.isCancelled()); 821b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(periodic.isDone()); 822b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 824b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS)); 825b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(p.isTerminated()); 826b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(2 + (effectiveDelayedPolicy ? 1 : 0), ran.get()); 827b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }} 8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed submit of callable returns result 8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitCallable() throws Exception { 833b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 834b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<String> future = e.submit(new StringTask()); 8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String result = future.get(); 8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed submit of runnable returns successfully 8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitRunnable() throws Exception { 845b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 846b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<?> future = e.submit(new NoOpRunnable()); 8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle future.get(); 8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(future.isDone()); 8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed submit of (runnable, result) returns result 8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSubmitRunnable2() throws Exception { 857b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 858b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING); 8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String result = future.get(); 8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(null) throws NPE 8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny1() throws Exception { 869b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 870b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 871b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 872b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(null); 873b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 874b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(empty collection) throws IAE 8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny2() throws Exception { 882b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 883b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 884b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 885b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(new ArrayList<Callable<String>>()); 886b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 887b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (IllegalArgumentException success) {} 8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) throws NPE if c has null elements 8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny3() throws Exception { 8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CountDownLatch latch = new CountDownLatch(1); 896b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 897b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 898b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 899b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(latchAwaitingStringTask(latch)); 900b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 901b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 902b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l); 903b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 904b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) throws ExecutionException if no task completes 9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny4() throws Exception { 913b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 914b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 915b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 916b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 917b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 918b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l); 919b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 920b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 921b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 922b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAny(c) returns result of some task 9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAny5() throws Exception { 930b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 931b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle String result = e.invokeAny(l); 9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(null) throws NPE 9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll1() throws Exception { 944b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 945b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 946b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 947b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(null); 948b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 949b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(empty collection) returns empty collection 9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll2() throws Exception { 957b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 958b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>()); 9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r.isEmpty()); 9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(c) throws NPE if c has null elements 9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll3() throws Exception { 968b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 969b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 970b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 971b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 972b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 973b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 974b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l); 975b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 976b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of invokeAll(c) throws exception on failed task 9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll4() throws Exception { 984b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 985b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 986b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 987b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 988b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> futures = e.invokeAll(l); 989b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, futures.size()); 990b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 991b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak futures.get(0).get(); 992b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 993b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 994b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 995b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(c) returns results of all completed tasks 10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll5() throws Exception { 1003b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1004b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> futures = e.invokeAll(l); 10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, futures.size()); 10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Future<String> future : futures) 10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(null) throws NPE 10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny1() throws Exception { 1019b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1020b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1021b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1022b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS); 1023b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1024b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(,,null) throws NPE 10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAnyNullTimeUnit() throws Exception { 1032b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1033b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1034b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1035b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 1036b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1037b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, MEDIUM_DELAY_MS, null); 1038b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1039b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(empty collection) throws IAE 10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny2() throws Exception { 1047b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1048b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1049b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1050b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS); 1051b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1052b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (IllegalArgumentException success) {} 10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) throws NPE if c has null elements 10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny3() throws Exception { 10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CountDownLatch latch = new CountDownLatch(1); 1061b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1062b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1063b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1064b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(latchAwaitingStringTask(latch)); 1065b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 1066b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1067b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS); 1068b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1069b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle latch.countDown(); 10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) throws ExecutionException if no task completes 10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny4() throws Exception { 1078b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1079b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1080b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1081b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1082b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 1083b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1084b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS); 1085b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1086b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 1087b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 1088b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 1089b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAny(c) returns result of some task 10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAny5() throws Exception { 1097b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1098b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1099b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 1103b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS); 11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, result); 1105b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS); 11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(null) throws NPE 11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll1() throws Exception { 1113b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1114b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1115b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1116b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS); 1117b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1118b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(,,null) throws NPE 11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAllNullTimeUnit() throws Exception { 1126b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1127b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1128b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1129b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 1130b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1131b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, MEDIUM_DELAY_MS, null); 1132b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1133b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(empty collection) returns empty collection 11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll2() throws Exception { 1141b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1142b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1143b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), 1144b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak MEDIUM_DELAY_MS, MILLISECONDS); 11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(r.isEmpty()); 11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(c) throws NPE if c has null elements 11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll3() throws Exception { 1153b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1154b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1155b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1156b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new StringTask()); 1157b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(null); 1158b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1159b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS); 1160b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1161b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (NullPointerException success) {} 11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of element of invokeAll(c) throws exception on failed task 11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll4() throws Exception { 1169b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1170b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 1171b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> l = new ArrayList<Callable<String>>(); 1172b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak l.add(new NPETask()); 1173b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> futures = 1174b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS); 1175b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(1, futures.size()); 1176b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1177b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak futures.get(0).get(); 1178b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 1179b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (ExecutionException success) { 1180b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(success.getCause() instanceof NullPointerException); 1181b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(c) returns results of all completed tasks 11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll5() throws Exception { 1189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService e = new ScheduledThreadPoolExecutor(2); 1190b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(e)) { 11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Callable<String>> l = new ArrayList<Callable<String>>(); 11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle l.add(new StringTask()); 11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle List<Future<String>> futures = 1195b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS); 11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, futures.size()); 11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (Future<String> future : futures) 11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(TEST_STRING, future.get()); 11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed invokeAll(c) cancels tasks not completed by timeout 12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTimedInvokeAll6() throws Exception { 1206b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (long timeout = timeoutMillis();;) { 1207b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch done = new CountDownLatch(1); 1208b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Callable<String> waiter = new CheckedCallable<String>() { 1209b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public String realCall() { 1210b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { done.await(LONG_DELAY_MS, MILLISECONDS); } 1211b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak catch (InterruptedException ok) {} 1212b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return "1"; }}; 1213b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ExecutorService p = new ScheduledThreadPoolExecutor(2); 1214b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p, done)) { 1215b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Callable<String>> tasks = new ArrayList<>(); 1216b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(new StringTask("0")); 1217b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(waiter); 1218b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak tasks.add(new StringTask("2")); 1219b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1220b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List<Future<String>> futures = 1221b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.invokeAll(tasks, timeout, MILLISECONDS); 1222b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals(tasks.size(), futures.size()); 1223b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) >= timeout); 1224b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (Future future : futures) 1225b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(future.isDone()); 1226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(futures.get(1).isCancelled()); 1227b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 1228b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals("0", futures.get(0).get()); 1229b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertEquals("2", futures.get(2).get()); 1230b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak break; 1231b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (CancellationException retryWithLongerTimeout) { 1232b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak timeout *= 2; 1233b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (timeout >= LONG_DELAY_MS / 2) 1234b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak fail("expected exactly one task to be cancelled"); 1235b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 1236b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 1237b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 1238b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 1239b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 1240b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak /** 1241b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * A fixed delay task with overflowing period should not prevent a 1242b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * one-shot task from executing. 1243b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * https://bugs.openjdk.java.net/browse/JDK-8051859 1244b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak */ 1245b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void testScheduleWithFixedDelay_overflow() throws Exception { 1246b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch delayedDone = new CountDownLatch(1); 1247b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final CountDownLatch immediateDone = new CountDownLatch(1); 1248b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final ScheduledThreadPoolExecutor p = new ScheduledThreadPoolExecutor(1); 1249b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(p)) { 1250b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable immediate = new Runnable() { public void run() { 1251b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak immediateDone.countDown(); 1252b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 1253b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak final Runnable delayed = new Runnable() { public void run() { 1254b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak delayedDone.countDown(); 1255b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.submit(immediate); 1256b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 1257b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.scheduleWithFixedDelay(delayed, 0L, Long.MAX_VALUE, SECONDS); 1258b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(delayedDone); 1259b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak await(immediateDone); 12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1264