ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
(Generate patch)

Comparing jsr166/src/test/tck/ThreadPoolExecutorTest.java (file contents):
Revision 1.37 by jsr166, Mon Oct 11 07:21:32 2010 UTC vs.
Revision 1.98 by jsr166, Sun Oct 4 07:23:20 2015 UTC

# Line 1 | Line 1
1   /*
2   * Written by Doug Lea with assistance from members of JCP JSR-166
3   * Expert Group and released to the public domain, as explained at
4 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   * Other contributors include Andrew Wright, Jeffrey Hayes,
6   * Pat Fisher, Mike Judd.
7   */
8  
9 import java.util.concurrent.*;
9   import static java.util.concurrent.TimeUnit.MILLISECONDS;
10 < import java.util.concurrent.atomic.*;
11 < import junit.framework.*;
12 < import java.util.*;
10 > import static java.util.concurrent.TimeUnit.NANOSECONDS;
11 > import static java.util.concurrent.TimeUnit.SECONDS;
12 >
13 > import java.util.ArrayList;
14 > import java.util.List;
15 > import java.util.concurrent.ArrayBlockingQueue;
16 > import java.util.concurrent.BlockingQueue;
17 > import java.util.concurrent.Callable;
18 > import java.util.concurrent.CancellationException;
19 > import java.util.concurrent.CountDownLatch;
20 > import java.util.concurrent.ExecutionException;
21 > import java.util.concurrent.Executors;
22 > import java.util.concurrent.ExecutorService;
23 > import java.util.concurrent.Future;
24 > import java.util.concurrent.FutureTask;
25 > import java.util.concurrent.LinkedBlockingQueue;
26 > import java.util.concurrent.RejectedExecutionException;
27 > import java.util.concurrent.RejectedExecutionHandler;
28 > import java.util.concurrent.SynchronousQueue;
29 > import java.util.concurrent.ThreadFactory;
30 > import java.util.concurrent.ThreadPoolExecutor;
31 > import java.util.concurrent.TimeUnit;
32 > import java.util.concurrent.atomic.AtomicInteger;
33 >
34 > import junit.framework.Test;
35 > import junit.framework.TestSuite;
36  
37   public class ThreadPoolExecutorTest extends JSR166TestCase {
38      public static void main(String[] args) {
39 <        junit.textui.TestRunner.run(suite());
39 >        main(suite(), args);
40      }
41      public static Test suite() {
42          return new TestSuite(ThreadPoolExecutorTest.class);
43      }
44  
45      static class ExtendedTPE extends ThreadPoolExecutor {
46 <        volatile boolean beforeCalled = false;
47 <        volatile boolean afterCalled = false;
48 <        volatile boolean terminatedCalled = false;
46 >        final CountDownLatch beforeCalled = new CountDownLatch(1);
47 >        final CountDownLatch afterCalled = new CountDownLatch(1);
48 >        final CountDownLatch terminatedCalled = new CountDownLatch(1);
49 >
50          public ExtendedTPE() {
51              super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
52          }
53          protected void beforeExecute(Thread t, Runnable r) {
54 <            beforeCalled = true;
54 >            beforeCalled.countDown();
55          }
56          protected void afterExecute(Runnable r, Throwable t) {
57 <            afterCalled = true;
57 >            afterCalled.countDown();
58          }
59          protected void terminated() {
60 <            terminatedCalled = true;
60 >            terminatedCalled.countDown();
61 >        }
62 >
63 >        public boolean beforeCalled() {
64 >            return beforeCalled.getCount() == 0;
65 >        }
66 >        public boolean afterCalled() {
67 >            return afterCalled.getCount() == 0;
68 >        }
69 >        public boolean terminatedCalled() {
70 >            return terminatedCalled.getCount() == 0;
71          }
72      }
73  
# Line 46 | Line 79 | public class ThreadPoolExecutorTest exte
79          }
80      }
81  
49
82      /**
83       * execute successfully executes a runnable
84       */
# Line 55 | Line 87 | public class ThreadPoolExecutorTest exte
87              new ThreadPoolExecutor(1, 1,
88                                     LONG_DELAY_MS, MILLISECONDS,
89                                     new ArrayBlockingQueue<Runnable>(10));
90 <        final CountDownLatch done = new CountDownLatch(1);
91 <        final Runnable task = new CheckedRunnable() {
92 <            public void realRun() {
93 <                done.countDown();
62 <            }};
63 <        try {
90 >        try (PoolCleaner cleaner = cleaner(p)) {
91 >            final CountDownLatch done = new CountDownLatch(1);
92 >            final Runnable task = new CheckedRunnable() {
93 >                public void realRun() { done.countDown(); }};
94              p.execute(task);
95 <            assertTrue(done.await(SMALL_DELAY_MS, MILLISECONDS));
66 <        } finally {
67 <            joinPool(p);
95 >            assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
96          }
97      }
98  
# Line 77 | Line 105 | public class ThreadPoolExecutorTest exte
105              new ThreadPoolExecutor(2, 2,
106                                     LONG_DELAY_MS, MILLISECONDS,
107                                     new ArrayBlockingQueue<Runnable>(10));
108 <        final CountDownLatch threadStarted = new CountDownLatch(1);
109 <        final CountDownLatch done = new CountDownLatch(1);
110 <        try {
108 >        try (PoolCleaner cleaner = cleaner(p)) {
109 >            final CountDownLatch threadStarted = new CountDownLatch(1);
110 >            final CountDownLatch done = new CountDownLatch(1);
111              assertEquals(0, p.getActiveCount());
112              p.execute(new CheckedRunnable() {
113                  public void realRun() throws InterruptedException {
# Line 87 | Line 115 | public class ThreadPoolExecutorTest exte
115                      assertEquals(1, p.getActiveCount());
116                      done.await();
117                  }});
118 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
118 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
119              assertEquals(1, p.getActiveCount());
92        } finally {
120              done.countDown();
94            joinPool(p);
121          }
122      }
123  
# Line 100 | Line 126 | public class ThreadPoolExecutorTest exte
126       */
127      public void testPrestartCoreThread() {
128          final ThreadPoolExecutor p =
129 <            new ThreadPoolExecutor(2, 2,
129 >            new ThreadPoolExecutor(2, 6,
130                                     LONG_DELAY_MS, MILLISECONDS,
131                                     new ArrayBlockingQueue<Runnable>(10));
132 <        assertEquals(0, p.getPoolSize());
133 <        assertTrue(p.prestartCoreThread());
134 <        assertEquals(1, p.getPoolSize());
135 <        assertTrue(p.prestartCoreThread());
136 <        assertEquals(2, p.getPoolSize());
137 <        assertFalse(p.prestartCoreThread());
138 <        assertEquals(2, p.getPoolSize());
139 <        joinPool(p);
132 >        try (PoolCleaner cleaner = cleaner(p)) {
133 >            assertEquals(0, p.getPoolSize());
134 >            assertTrue(p.prestartCoreThread());
135 >            assertEquals(1, p.getPoolSize());
136 >            assertTrue(p.prestartCoreThread());
137 >            assertEquals(2, p.getPoolSize());
138 >            assertFalse(p.prestartCoreThread());
139 >            assertEquals(2, p.getPoolSize());
140 >            p.setCorePoolSize(4);
141 >            assertTrue(p.prestartCoreThread());
142 >            assertEquals(3, p.getPoolSize());
143 >            assertTrue(p.prestartCoreThread());
144 >            assertEquals(4, p.getPoolSize());
145 >            assertFalse(p.prestartCoreThread());
146 >            assertEquals(4, p.getPoolSize());
147 >        }
148      }
149  
150      /**
# Line 118 | Line 152 | public class ThreadPoolExecutorTest exte
152       */
153      public void testPrestartAllCoreThreads() {
154          final ThreadPoolExecutor p =
155 <            new ThreadPoolExecutor(2, 2,
155 >            new ThreadPoolExecutor(2, 6,
156                                     LONG_DELAY_MS, MILLISECONDS,
157                                     new ArrayBlockingQueue<Runnable>(10));
158 <        assertEquals(0, p.getPoolSize());
159 <        p.prestartAllCoreThreads();
160 <        assertEquals(2, p.getPoolSize());
161 <        p.prestartAllCoreThreads();
162 <        assertEquals(2, p.getPoolSize());
163 <        joinPool(p);
158 >        try (PoolCleaner cleaner = cleaner(p)) {
159 >            assertEquals(0, p.getPoolSize());
160 >            p.prestartAllCoreThreads();
161 >            assertEquals(2, p.getPoolSize());
162 >            p.prestartAllCoreThreads();
163 >            assertEquals(2, p.getPoolSize());
164 >            p.setCorePoolSize(4);
165 >            p.prestartAllCoreThreads();
166 >            assertEquals(4, p.getPoolSize());
167 >            p.prestartAllCoreThreads();
168 >            assertEquals(4, p.getPoolSize());
169 >        }
170      }
171  
172      /**
# Line 138 | Line 178 | public class ThreadPoolExecutorTest exte
178              new ThreadPoolExecutor(2, 2,
179                                     LONG_DELAY_MS, MILLISECONDS,
180                                     new ArrayBlockingQueue<Runnable>(10));
181 <        final CountDownLatch threadStarted = new CountDownLatch(1);
182 <        final CountDownLatch threadProceed = new CountDownLatch(1);
183 <        final CountDownLatch threadDone = new CountDownLatch(1);
184 <        try {
181 >        try (PoolCleaner cleaner = cleaner(p)) {
182 >            final CountDownLatch threadStarted = new CountDownLatch(1);
183 >            final CountDownLatch threadProceed = new CountDownLatch(1);
184 >            final CountDownLatch threadDone = new CountDownLatch(1);
185              assertEquals(0, p.getCompletedTaskCount());
186              p.execute(new CheckedRunnable() {
187                  public void realRun() throws InterruptedException {
# Line 150 | Line 190 | public class ThreadPoolExecutorTest exte
190                      threadProceed.await();
191                      threadDone.countDown();
192                  }});
193 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
193 >            await(threadStarted);
194              assertEquals(0, p.getCompletedTaskCount());
195              threadProceed.countDown();
196              threadDone.await();
197 <            Thread.sleep(SHORT_DELAY_MS);
198 <            assertEquals(1, p.getCompletedTaskCount());
199 <        } finally {
200 <            joinPool(p);
197 >            long startTime = System.nanoTime();
198 >            while (p.getCompletedTaskCount() != 1) {
199 >                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
200 >                    fail("timed out");
201 >                Thread.yield();
202 >            }
203          }
204      }
205  
# Line 169 | Line 211 | public class ThreadPoolExecutorTest exte
211              new ThreadPoolExecutor(1, 1,
212                                     LONG_DELAY_MS, MILLISECONDS,
213                                     new ArrayBlockingQueue<Runnable>(10));
214 <        assertEquals(1, p.getCorePoolSize());
215 <        joinPool(p);
214 >        try (PoolCleaner cleaner = cleaner(p)) {
215 >            assertEquals(1, p.getCorePoolSize());
216 >        }
217      }
218  
219      /**
# Line 181 | Line 224 | public class ThreadPoolExecutorTest exte
224              new ThreadPoolExecutor(2, 2,
225                                     1000, MILLISECONDS,
226                                     new ArrayBlockingQueue<Runnable>(10));
227 <        assertEquals(1, p.getKeepAliveTime(TimeUnit.SECONDS));
228 <        joinPool(p);
227 >        try (PoolCleaner cleaner = cleaner(p)) {
228 >            assertEquals(1, p.getKeepAliveTime(SECONDS));
229 >        }
230      }
231  
188
232      /**
233       * getThreadFactory returns factory in constructor if not set
234       */
235      public void testGetThreadFactory() {
236 <        ThreadFactory tf = new SimpleThreadFactory();
236 >        ThreadFactory threadFactory = new SimpleThreadFactory();
237          final ThreadPoolExecutor p =
238              new ThreadPoolExecutor(1, 2,
239                                     LONG_DELAY_MS, MILLISECONDS,
240                                     new ArrayBlockingQueue<Runnable>(10),
241 <                                   tf,
241 >                                   threadFactory,
242                                     new NoOpREHandler());
243 <        assertSame(tf, p.getThreadFactory());
244 <        joinPool(p);
243 >        try (PoolCleaner cleaner = cleaner(p)) {
244 >            assertSame(threadFactory, p.getThreadFactory());
245 >        }
246      }
247  
248      /**
# Line 209 | Line 253 | public class ThreadPoolExecutorTest exte
253              new ThreadPoolExecutor(1, 2,
254                                     LONG_DELAY_MS, MILLISECONDS,
255                                     new ArrayBlockingQueue<Runnable>(10));
256 <        ThreadFactory tf = new SimpleThreadFactory();
257 <        p.setThreadFactory(tf);
258 <        assertSame(tf, p.getThreadFactory());
259 <        joinPool(p);
256 >        try (PoolCleaner cleaner = cleaner(p)) {
257 >            ThreadFactory threadFactory = new SimpleThreadFactory();
258 >            p.setThreadFactory(threadFactory);
259 >            assertSame(threadFactory, p.getThreadFactory());
260 >        }
261      }
262  
218
263      /**
264       * setThreadFactory(null) throws NPE
265       */
# Line 224 | Line 268 | public class ThreadPoolExecutorTest exte
268              new ThreadPoolExecutor(1, 2,
269                                     LONG_DELAY_MS, MILLISECONDS,
270                                     new ArrayBlockingQueue<Runnable>(10));
271 <        try {
272 <            p.setThreadFactory(null);
273 <            shouldThrow();
274 <        } catch (NullPointerException success) {
275 <        } finally {
232 <            joinPool(p);
271 >        try (PoolCleaner cleaner = cleaner(p)) {
272 >            try {
273 >                p.setThreadFactory(null);
274 >                shouldThrow();
275 >            } catch (NullPointerException success) {}
276          }
277      }
278  
# Line 237 | Line 280 | public class ThreadPoolExecutorTest exte
280       * getRejectedExecutionHandler returns handler in constructor if not set
281       */
282      public void testGetRejectedExecutionHandler() {
283 <        final RejectedExecutionHandler h = new NoOpREHandler();
283 >        final RejectedExecutionHandler handler = new NoOpREHandler();
284          final ThreadPoolExecutor p =
285              new ThreadPoolExecutor(1, 2,
286                                     LONG_DELAY_MS, MILLISECONDS,
287                                     new ArrayBlockingQueue<Runnable>(10),
288 <                                   h);
289 <        assertSame(h, p.getRejectedExecutionHandler());
290 <        joinPool(p);
288 >                                   handler);
289 >        try (PoolCleaner cleaner = cleaner(p)) {
290 >            assertSame(handler, p.getRejectedExecutionHandler());
291 >        }
292      }
293  
294      /**
# Line 256 | Line 300 | public class ThreadPoolExecutorTest exte
300              new ThreadPoolExecutor(1, 2,
301                                     LONG_DELAY_MS, MILLISECONDS,
302                                     new ArrayBlockingQueue<Runnable>(10));
303 <        RejectedExecutionHandler h = new NoOpREHandler();
304 <        p.setRejectedExecutionHandler(h);
305 <        assertSame(h, p.getRejectedExecutionHandler());
306 <        joinPool(p);
303 >        try (PoolCleaner cleaner = cleaner(p)) {
304 >            RejectedExecutionHandler handler = new NoOpREHandler();
305 >            p.setRejectedExecutionHandler(handler);
306 >            assertSame(handler, p.getRejectedExecutionHandler());
307 >        }
308      }
309  
265
310      /**
311       * setRejectedExecutionHandler(null) throws NPE
312       */
# Line 271 | Line 315 | public class ThreadPoolExecutorTest exte
315              new ThreadPoolExecutor(1, 2,
316                                     LONG_DELAY_MS, MILLISECONDS,
317                                     new ArrayBlockingQueue<Runnable>(10));
318 <        try {
319 <            p.setRejectedExecutionHandler(null);
320 <            shouldThrow();
321 <        } catch (NullPointerException success) {
322 <        } finally {
279 <            joinPool(p);
318 >        try (PoolCleaner cleaner = cleaner(p)) {
319 >            try {
320 >                p.setRejectedExecutionHandler(null);
321 >                shouldThrow();
322 >            } catch (NullPointerException success) {}
323          }
324      }
325  
283
326      /**
327       * getLargestPoolSize increases, but doesn't overestimate, when
328       * multiple threads active
# Line 291 | Line 333 | public class ThreadPoolExecutorTest exte
333              new ThreadPoolExecutor(THREADS, THREADS,
334                                     LONG_DELAY_MS, MILLISECONDS,
335                                     new ArrayBlockingQueue<Runnable>(10));
336 <        final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
337 <        final CountDownLatch done = new CountDownLatch(1);
338 <        try {
336 >        try (PoolCleaner cleaner = cleaner(p)) {
337 >            final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
338 >            final CountDownLatch done = new CountDownLatch(1);
339              assertEquals(0, p.getLargestPoolSize());
340              for (int i = 0; i < THREADS; i++)
341                  p.execute(new CheckedRunnable() {
# Line 302 | Line 344 | public class ThreadPoolExecutorTest exte
344                          done.await();
345                          assertEquals(THREADS, p.getLargestPoolSize());
346                      }});
347 <            assertTrue(threadsStarted.await(SMALL_DELAY_MS, MILLISECONDS));
306 <            assertEquals(THREADS, p.getLargestPoolSize());
307 <        } finally {
308 <            done.countDown();
309 <            joinPool(p);
347 >            assertTrue(threadsStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
348              assertEquals(THREADS, p.getLargestPoolSize());
349 +            done.countDown();   // release pool
350          }
351 +        assertEquals(THREADS, p.getLargestPoolSize());
352      }
353  
354      /**
# Line 320 | Line 360 | public class ThreadPoolExecutorTest exte
360              new ThreadPoolExecutor(2, 3,
361                                     LONG_DELAY_MS, MILLISECONDS,
362                                     new ArrayBlockingQueue<Runnable>(10));
363 <        assertEquals(3, p.getMaximumPoolSize());
364 <        joinPool(p);
363 >        try (PoolCleaner cleaner = cleaner(p)) {
364 >            assertEquals(3, p.getMaximumPoolSize());
365 >            p.setMaximumPoolSize(5);
366 >            assertEquals(5, p.getMaximumPoolSize());
367 >            p.setMaximumPoolSize(4);
368 >            assertEquals(4, p.getMaximumPoolSize());
369 >        }
370      }
371  
372      /**
# Line 333 | Line 378 | public class ThreadPoolExecutorTest exte
378              new ThreadPoolExecutor(1, 1,
379                                     LONG_DELAY_MS, MILLISECONDS,
380                                     new ArrayBlockingQueue<Runnable>(10));
381 <        final CountDownLatch threadStarted = new CountDownLatch(1);
382 <        final CountDownLatch done = new CountDownLatch(1);
383 <        try {
381 >        try (PoolCleaner cleaner = cleaner(p)) {
382 >            final CountDownLatch threadStarted = new CountDownLatch(1);
383 >            final CountDownLatch done = new CountDownLatch(1);
384              assertEquals(0, p.getPoolSize());
385              p.execute(new CheckedRunnable() {
386                  public void realRun() throws InterruptedException {
# Line 343 | Line 388 | public class ThreadPoolExecutorTest exte
388                      assertEquals(1, p.getPoolSize());
389                      done.await();
390                  }});
391 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
391 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
392              assertEquals(1, p.getPoolSize());
393 <        } finally {
349 <            done.countDown();
350 <            joinPool(p);
393 >            done.countDown();   // release pool
394          }
395      }
396  
# Line 359 | Line 402 | public class ThreadPoolExecutorTest exte
402              new ThreadPoolExecutor(1, 1,
403                                     LONG_DELAY_MS, MILLISECONDS,
404                                     new ArrayBlockingQueue<Runnable>(10));
405 <        final CountDownLatch threadStarted = new CountDownLatch(1);
406 <        final CountDownLatch done = new CountDownLatch(1);
407 <        try {
405 >        try (PoolCleaner cleaner = cleaner(p)) {
406 >            final CountDownLatch threadStarted = new CountDownLatch(1);
407 >            final CountDownLatch done = new CountDownLatch(1);
408              assertEquals(0, p.getTaskCount());
409              p.execute(new CheckedRunnable() {
410                  public void realRun() throws InterruptedException {
# Line 369 | Line 412 | public class ThreadPoolExecutorTest exte
412                      assertEquals(1, p.getTaskCount());
413                      done.await();
414                  }});
415 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
415 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
416              assertEquals(1, p.getTaskCount());
374        } finally {
417              done.countDown();
376            joinPool(p);
418          }
419      }
420  
421      /**
422 <     * isShutDown is false before shutdown, true after
422 >     * isShutdown is false before shutdown, true after
423       */
424      public void testIsShutdown() {
425          final ThreadPoolExecutor p =
426              new ThreadPoolExecutor(1, 1,
427                                     LONG_DELAY_MS, MILLISECONDS,
428                                     new ArrayBlockingQueue<Runnable>(10));
429 <        assertFalse(p.isShutdown());
430 <        try { p.shutdown(); } catch (SecurityException ok) { return; }
431 <        assertTrue(p.isShutdown());
432 <        joinPool(p);
429 >        try (PoolCleaner cleaner = cleaner(p)) {
430 >            assertFalse(p.isShutdown());
431 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
432 >            assertTrue(p.isShutdown());
433 >        }
434      }
435  
436 +    /**
437 +     * awaitTermination on a non-shutdown pool times out
438 +     */
439 +    public void testAwaitTermination_timesOut() throws InterruptedException {
440 +        final ThreadPoolExecutor p =
441 +            new ThreadPoolExecutor(1, 1,
442 +                                   LONG_DELAY_MS, MILLISECONDS,
443 +                                   new ArrayBlockingQueue<Runnable>(10));
444 +        try (PoolCleaner cleaner = cleaner(p)) {
445 +            assertFalse(p.isTerminated());
446 +            assertFalse(p.awaitTermination(Long.MIN_VALUE, NANOSECONDS));
447 +            assertFalse(p.awaitTermination(Long.MIN_VALUE, MILLISECONDS));
448 +            assertFalse(p.awaitTermination(-1L, NANOSECONDS));
449 +            assertFalse(p.awaitTermination(-1L, MILLISECONDS));
450 +            assertFalse(p.awaitTermination(0L, NANOSECONDS));
451 +            assertFalse(p.awaitTermination(0L, MILLISECONDS));
452 +            long timeoutNanos = 999999L;
453 +            long startTime = System.nanoTime();
454 +            assertFalse(p.awaitTermination(timeoutNanos, NANOSECONDS));
455 +            assertTrue(System.nanoTime() - startTime >= timeoutNanos);
456 +            assertFalse(p.isTerminated());
457 +            startTime = System.nanoTime();
458 +            long timeoutMillis = timeoutMillis();
459 +            assertFalse(p.awaitTermination(timeoutMillis, MILLISECONDS));
460 +            assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
461 +            assertFalse(p.isTerminated());
462 +            try { p.shutdown(); } catch (SecurityException ok) { return; }
463 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
464 +            assertTrue(p.isTerminated());
465 +        }
466 +    }
467  
468      /**
469       * isTerminated is false before termination, true after
# Line 400 | Line 473 | public class ThreadPoolExecutorTest exte
473              new ThreadPoolExecutor(1, 1,
474                                     LONG_DELAY_MS, MILLISECONDS,
475                                     new ArrayBlockingQueue<Runnable>(10));
476 <        final CountDownLatch threadStarted = new CountDownLatch(1);
477 <        final CountDownLatch done = new CountDownLatch(1);
478 <        assertFalse(p.isTerminated());
479 <        try {
476 >        try (PoolCleaner cleaner = cleaner(p)) {
477 >            final CountDownLatch threadStarted = new CountDownLatch(1);
478 >            final CountDownLatch done = new CountDownLatch(1);
479 >            assertFalse(p.isTerminating());
480              p.execute(new CheckedRunnable() {
481                  public void realRun() throws InterruptedException {
482 +                    assertFalse(p.isTerminating());
483                      threadStarted.countDown();
410                    assertFalse(p.isTerminated());
484                      done.await();
485                  }});
486 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
486 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
487 >            assertFalse(p.isTerminating());
488              done.countDown();
415        } finally {
489              try { p.shutdown(); } catch (SecurityException ok) { return; }
490 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
491 +            assertTrue(p.isTerminated());
492 +            assertFalse(p.isTerminating());
493          }
418        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
419        assertTrue(p.isTerminated());
494      }
495  
496      /**
# Line 427 | Line 501 | public class ThreadPoolExecutorTest exte
501              new ThreadPoolExecutor(1, 1,
502                                     LONG_DELAY_MS, MILLISECONDS,
503                                     new ArrayBlockingQueue<Runnable>(10));
504 <        final CountDownLatch threadStarted = new CountDownLatch(1);
505 <        final CountDownLatch done = new CountDownLatch(1);
506 <        try {
504 >        try (PoolCleaner cleaner = cleaner(p)) {
505 >            final CountDownLatch threadStarted = new CountDownLatch(1);
506 >            final CountDownLatch done = new CountDownLatch(1);
507              assertFalse(p.isTerminating());
508              p.execute(new CheckedRunnable() {
509                  public void realRun() throws InterruptedException {
436                    threadStarted.countDown();
510                      assertFalse(p.isTerminating());
511 +                    threadStarted.countDown();
512                      done.await();
513                  }});
514 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
514 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
515              assertFalse(p.isTerminating());
516              done.countDown();
443        } finally {
517              try { p.shutdown(); } catch (SecurityException ok) { return; }
518 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
519 +            assertTrue(p.isTerminated());
520 +            assertFalse(p.isTerminating());
521          }
446        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
447        assertTrue(p.isTerminated());
448        assertFalse(p.isTerminating());
522      }
523  
524      /**
# Line 457 | Line 530 | public class ThreadPoolExecutorTest exte
530              new ThreadPoolExecutor(1, 1,
531                                     LONG_DELAY_MS, MILLISECONDS,
532                                     q);
533 <        final CountDownLatch threadStarted = new CountDownLatch(1);
534 <        final CountDownLatch done = new CountDownLatch(1);
535 <        try {
533 >        try (PoolCleaner cleaner = cleaner(p)) {
534 >            final CountDownLatch threadStarted = new CountDownLatch(1);
535 >            final CountDownLatch done = new CountDownLatch(1);
536              FutureTask[] tasks = new FutureTask[5];
537              for (int i = 0; i < tasks.length; i++) {
538                  Callable task = new CheckedCallable<Boolean>() {
# Line 472 | Line 545 | public class ThreadPoolExecutorTest exte
545                  tasks[i] = new FutureTask(task);
546                  p.execute(tasks[i]);
547              }
548 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
548 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
549              assertSame(q, p.getQueue());
550              assertFalse(q.contains(tasks[0]));
551              assertTrue(q.contains(tasks[tasks.length - 1]));
552              assertEquals(tasks.length - 1, q.size());
480        } finally {
553              done.countDown();
482            joinPool(p);
554          }
555      }
556  
# Line 492 | Line 563 | public class ThreadPoolExecutorTest exte
563              new ThreadPoolExecutor(1, 1,
564                                     LONG_DELAY_MS, MILLISECONDS,
565                                     q);
566 <        Runnable[] tasks = new Runnable[5];
567 <        final CountDownLatch threadStarted = new CountDownLatch(1);
568 <        final CountDownLatch done = new CountDownLatch(1);
569 <        try {
566 >        try (PoolCleaner cleaner = cleaner(p)) {
567 >            Runnable[] tasks = new Runnable[6];
568 >            final CountDownLatch threadStarted = new CountDownLatch(1);
569 >            final CountDownLatch done = new CountDownLatch(1);
570              for (int i = 0; i < tasks.length; i++) {
571                  tasks[i] = new CheckedRunnable() {
572                      public void realRun() throws InterruptedException {
# Line 504 | Line 575 | public class ThreadPoolExecutorTest exte
575                      }};
576                  p.execute(tasks[i]);
577              }
578 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
578 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
579              assertFalse(p.remove(tasks[0]));
580              assertTrue(q.contains(tasks[4]));
581              assertTrue(q.contains(tasks[3]));
# Line 514 | Line 585 | public class ThreadPoolExecutorTest exte
585              assertTrue(q.contains(tasks[3]));
586              assertTrue(p.remove(tasks[3]));
587              assertFalse(q.contains(tasks[3]));
517        } finally {
588              done.countDown();
519            joinPool(p);
589          }
590      }
591  
# Line 531 | Line 600 | public class ThreadPoolExecutorTest exte
600              new ThreadPoolExecutor(1, 1,
601                                     LONG_DELAY_MS, MILLISECONDS,
602                                     q);
603 <        FutureTask[] tasks = new FutureTask[5];
604 <        try {
603 >        try (PoolCleaner cleaner = cleaner(p)) {
604 >            FutureTask[] tasks = new FutureTask[5];
605              for (int i = 0; i < tasks.length; i++) {
606                  Callable task = new CheckedCallable<Boolean>() {
607                      public Boolean realCall() throws InterruptedException {
# Line 543 | Line 612 | public class ThreadPoolExecutorTest exte
612                  tasks[i] = new FutureTask(task);
613                  p.execute(tasks[i]);
614              }
615 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
615 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
616              assertEquals(tasks.length, p.getTaskCount());
617              assertEquals(tasks.length - 1, q.size());
618              assertEquals(1L, p.getActiveCount());
# Line 556 | Line 625 | public class ThreadPoolExecutorTest exte
625              p.purge();         // Nothing to do
626              assertEquals(tasks.length - 3, q.size());
627              assertEquals(tasks.length - 2, p.getTaskCount());
559        } finally {
628              done.countDown();
561            joinPool(p);
629          }
630      }
631  
632      /**
633 <     * shutDownNow returns a list containing tasks that were not run
633 >     * shutdownNow returns a list containing tasks that were not run,
634 >     * and those tasks are drained from the queue
635       */
636 <    public void testShutDownNow() {
636 >    public void testShutdownNow() throws InterruptedException {
637 >        final int poolSize = 2;
638 >        final int count = 5;
639 >        final AtomicInteger ran = new AtomicInteger(0);
640          final ThreadPoolExecutor p =
641 <            new ThreadPoolExecutor(1, 1,
641 >            new ThreadPoolExecutor(poolSize, poolSize,
642                                     LONG_DELAY_MS, MILLISECONDS,
643                                     new ArrayBlockingQueue<Runnable>(10));
644 <        List l;
645 <        try {
646 <            for (int i = 0; i < 5; i++)
576 <                p.execute(new MediumPossiblyInterruptedRunnable());
577 <        }
578 <        finally {
644 >        CountDownLatch threadsStarted = new CountDownLatch(poolSize);
645 >        Runnable waiter = new CheckedRunnable() { public void realRun() {
646 >            threadsStarted.countDown();
647              try {
648 <                l = p.shutdownNow();
649 <            } catch (SecurityException ok) { return; }
648 >                MILLISECONDS.sleep(2 * LONG_DELAY_MS);
649 >            } catch (InterruptedException success) {}
650 >            ran.getAndIncrement();
651 >        }};
652 >        for (int i = 0; i < count; i++)
653 >            p.execute(waiter);
654 >        assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
655 >        assertEquals(poolSize, p.getActiveCount());
656 >        assertEquals(0, p.getCompletedTaskCount());
657 >        final List<Runnable> queuedTasks;
658 >        try {
659 >            queuedTasks = p.shutdownNow();
660 >        } catch (SecurityException ok) {
661 >            return; // Allowed in case test doesn't have privs
662          }
663          assertTrue(p.isShutdown());
664 <        assertTrue(l.size() <= 4);
664 >        assertTrue(p.getQueue().isEmpty());
665 >        assertEquals(count - poolSize, queuedTasks.size());
666 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
667 >        assertTrue(p.isTerminated());
668 >        assertEquals(poolSize, ran.get());
669 >        assertEquals(poolSize, p.getCompletedTaskCount());
670      }
671  
672      // Exception Tests
673  
589
674      /**
675       * Constructor throws if corePoolSize argument is less than zero
676       */
677      public void testConstructor1() {
678          try {
679 <            new ThreadPoolExecutor(-1, 1,
596 <                                   LONG_DELAY_MS, MILLISECONDS,
679 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
680                                     new ArrayBlockingQueue<Runnable>(10));
681              shouldThrow();
682          } catch (IllegalArgumentException success) {}
# Line 604 | Line 687 | public class ThreadPoolExecutorTest exte
687       */
688      public void testConstructor2() {
689          try {
690 <            new ThreadPoolExecutor(1, -1,
608 <                                   LONG_DELAY_MS, MILLISECONDS,
690 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
691                                     new ArrayBlockingQueue<Runnable>(10));
692              shouldThrow();
693          } catch (IllegalArgumentException success) {}
# Line 616 | Line 698 | public class ThreadPoolExecutorTest exte
698       */
699      public void testConstructor3() {
700          try {
701 <            new ThreadPoolExecutor(1, 0,
620 <                                   LONG_DELAY_MS, MILLISECONDS,
701 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
702                                     new ArrayBlockingQueue<Runnable>(10));
703              shouldThrow();
704          } catch (IllegalArgumentException success) {}
# Line 628 | Line 709 | public class ThreadPoolExecutorTest exte
709       */
710      public void testConstructor4() {
711          try {
712 <            new ThreadPoolExecutor(1, 2,
632 <                                   -1L, MILLISECONDS,
712 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
713                                     new ArrayBlockingQueue<Runnable>(10));
714              shouldThrow();
715          } catch (IllegalArgumentException success) {}
# Line 640 | Line 720 | public class ThreadPoolExecutorTest exte
720       */
721      public void testConstructor5() {
722          try {
723 <            new ThreadPoolExecutor(2, 1,
644 <                                   LONG_DELAY_MS, MILLISECONDS,
723 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
724                                     new ArrayBlockingQueue<Runnable>(10));
725              shouldThrow();
726          } catch (IllegalArgumentException success) {}
# Line 652 | Line 731 | public class ThreadPoolExecutorTest exte
731       */
732      public void testConstructorNullPointerException() {
733          try {
734 <            new ThreadPoolExecutor(1, 2,
656 <                                   LONG_DELAY_MS, MILLISECONDS,
734 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
735                                     (BlockingQueue) null);
736              shouldThrow();
737          } catch (NullPointerException success) {}
738      }
739  
662
663
740      /**
741       * Constructor throws if corePoolSize argument is less than zero
742       */
743      public void testConstructor6() {
744          try {
745 <            new ThreadPoolExecutor(-1, 1,
670 <                                   LONG_DELAY_MS, MILLISECONDS,
745 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
746                                     new ArrayBlockingQueue<Runnable>(10),
747                                     new SimpleThreadFactory());
748              shouldThrow();
# Line 679 | Line 754 | public class ThreadPoolExecutorTest exte
754       */
755      public void testConstructor7() {
756          try {
757 <            new ThreadPoolExecutor(1, -1,
683 <                                   LONG_DELAY_MS, MILLISECONDS,
757 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
758                                     new ArrayBlockingQueue<Runnable>(10),
759                                     new SimpleThreadFactory());
760              shouldThrow();
# Line 692 | Line 766 | public class ThreadPoolExecutorTest exte
766       */
767      public void testConstructor8() {
768          try {
769 <            new ThreadPoolExecutor(1, 0,
696 <                                   LONG_DELAY_MS, MILLISECONDS,
769 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
770                                     new ArrayBlockingQueue<Runnable>(10),
771                                     new SimpleThreadFactory());
772              shouldThrow();
# Line 705 | Line 778 | public class ThreadPoolExecutorTest exte
778       */
779      public void testConstructor9() {
780          try {
781 <            new ThreadPoolExecutor(1, 2,
709 <                                   -1L, MILLISECONDS,
781 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
782                                     new ArrayBlockingQueue<Runnable>(10),
783                                     new SimpleThreadFactory());
784              shouldThrow();
# Line 718 | Line 790 | public class ThreadPoolExecutorTest exte
790       */
791      public void testConstructor10() {
792          try {
793 <            new ThreadPoolExecutor(2, 1,
722 <                                   LONG_DELAY_MS, MILLISECONDS,
793 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
794                                     new ArrayBlockingQueue<Runnable>(10),
795                                     new SimpleThreadFactory());
796              shouldThrow();
# Line 731 | Line 802 | public class ThreadPoolExecutorTest exte
802       */
803      public void testConstructorNullPointerException2() {
804          try {
805 <            new ThreadPoolExecutor(1, 2,
735 <                                   LONG_DELAY_MS, MILLISECONDS,
805 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
806                                     (BlockingQueue) null,
807                                     new SimpleThreadFactory());
808              shouldThrow();
# Line 744 | Line 814 | public class ThreadPoolExecutorTest exte
814       */
815      public void testConstructorNullPointerException3() {
816          try {
817 <            new ThreadPoolExecutor(1, 2,
748 <                                   LONG_DELAY_MS, MILLISECONDS,
817 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
818                                     new ArrayBlockingQueue<Runnable>(10),
819                                     (ThreadFactory) null);
820              shouldThrow();
821          } catch (NullPointerException success) {}
822      }
823  
755
824      /**
825       * Constructor throws if corePoolSize argument is less than zero
826       */
827      public void testConstructor11() {
828          try {
829 <            new ThreadPoolExecutor(-1, 1,
762 <                                   LONG_DELAY_MS, MILLISECONDS,
829 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
830                                     new ArrayBlockingQueue<Runnable>(10),
831                                     new NoOpREHandler());
832              shouldThrow();
# Line 771 | Line 838 | public class ThreadPoolExecutorTest exte
838       */
839      public void testConstructor12() {
840          try {
841 <            new ThreadPoolExecutor(1, -1,
775 <                                   LONG_DELAY_MS, MILLISECONDS,
841 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
842                                     new ArrayBlockingQueue<Runnable>(10),
843                                     new NoOpREHandler());
844              shouldThrow();
# Line 784 | Line 850 | public class ThreadPoolExecutorTest exte
850       */
851      public void testConstructor13() {
852          try {
853 <            new ThreadPoolExecutor(1, 0,
788 <                                   LONG_DELAY_MS, MILLISECONDS,
853 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
854                                     new ArrayBlockingQueue<Runnable>(10),
855                                     new NoOpREHandler());
856              shouldThrow();
# Line 797 | Line 862 | public class ThreadPoolExecutorTest exte
862       */
863      public void testConstructor14() {
864          try {
865 <            new ThreadPoolExecutor(1, 2,
801 <                                   -1L, MILLISECONDS,
865 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
866                                     new ArrayBlockingQueue<Runnable>(10),
867                                     new NoOpREHandler());
868              shouldThrow();
# Line 810 | Line 874 | public class ThreadPoolExecutorTest exte
874       */
875      public void testConstructor15() {
876          try {
877 <            new ThreadPoolExecutor(2, 1,
814 <                                   LONG_DELAY_MS, MILLISECONDS,
877 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
878                                     new ArrayBlockingQueue<Runnable>(10),
879                                     new NoOpREHandler());
880              shouldThrow();
# Line 823 | Line 886 | public class ThreadPoolExecutorTest exte
886       */
887      public void testConstructorNullPointerException4() {
888          try {
889 <            new ThreadPoolExecutor(1, 2,
827 <                                   LONG_DELAY_MS, MILLISECONDS,
889 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
890                                     (BlockingQueue) null,
891                                     new NoOpREHandler());
892              shouldThrow();
# Line 836 | Line 898 | public class ThreadPoolExecutorTest exte
898       */
899      public void testConstructorNullPointerException5() {
900          try {
901 <            new ThreadPoolExecutor(1, 2,
840 <                                   LONG_DELAY_MS, MILLISECONDS,
901 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
902                                     new ArrayBlockingQueue<Runnable>(10),
903                                     (RejectedExecutionHandler) null);
904              shouldThrow();
905          } catch (NullPointerException success) {}
906      }
907  
847
908      /**
909       * Constructor throws if corePoolSize argument is less than zero
910       */
911      public void testConstructor16() {
912          try {
913 <            new ThreadPoolExecutor(-1, 1,
854 <                                   LONG_DELAY_MS, MILLISECONDS,
913 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
914                                     new ArrayBlockingQueue<Runnable>(10),
915                                     new SimpleThreadFactory(),
916                                     new NoOpREHandler());
# Line 864 | Line 923 | public class ThreadPoolExecutorTest exte
923       */
924      public void testConstructor17() {
925          try {
926 <            new ThreadPoolExecutor(1, -1,
868 <                                   LONG_DELAY_MS, MILLISECONDS,
926 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
927                                     new ArrayBlockingQueue<Runnable>(10),
928                                     new SimpleThreadFactory(),
929                                     new NoOpREHandler());
# Line 878 | Line 936 | public class ThreadPoolExecutorTest exte
936       */
937      public void testConstructor18() {
938          try {
939 <            new ThreadPoolExecutor(1, 0,
882 <                                   LONG_DELAY_MS, MILLISECONDS,
939 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
940                                     new ArrayBlockingQueue<Runnable>(10),
941                                     new SimpleThreadFactory(),
942                                     new NoOpREHandler());
# Line 892 | Line 949 | public class ThreadPoolExecutorTest exte
949       */
950      public void testConstructor19() {
951          try {
952 <            new ThreadPoolExecutor(1, 2,
896 <                                   -1L, MILLISECONDS,
952 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
953                                     new ArrayBlockingQueue<Runnable>(10),
954                                     new SimpleThreadFactory(),
955                                     new NoOpREHandler());
# Line 906 | Line 962 | public class ThreadPoolExecutorTest exte
962       */
963      public void testConstructor20() {
964          try {
965 <            new ThreadPoolExecutor(2, 1,
910 <                                   LONG_DELAY_MS, MILLISECONDS,
965 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
966                                     new ArrayBlockingQueue<Runnable>(10),
967                                     new SimpleThreadFactory(),
968                                     new NoOpREHandler());
# Line 920 | Line 975 | public class ThreadPoolExecutorTest exte
975       */
976      public void testConstructorNullPointerException6() {
977          try {
978 <            new ThreadPoolExecutor(1, 2,
924 <                                   LONG_DELAY_MS, MILLISECONDS,
978 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
979                                     (BlockingQueue) null,
980                                     new SimpleThreadFactory(),
981                                     new NoOpREHandler());
# Line 934 | Line 988 | public class ThreadPoolExecutorTest exte
988       */
989      public void testConstructorNullPointerException7() {
990          try {
991 <            new ThreadPoolExecutor(1, 2,
938 <                                   LONG_DELAY_MS, MILLISECONDS,
991 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
992                                     new ArrayBlockingQueue<Runnable>(10),
993                                     new SimpleThreadFactory(),
994                                     (RejectedExecutionHandler) null);
# Line 948 | Line 1001 | public class ThreadPoolExecutorTest exte
1001       */
1002      public void testConstructorNullPointerException8() {
1003          try {
1004 <            new ThreadPoolExecutor(1, 2,
952 <                                   LONG_DELAY_MS, MILLISECONDS,
1004 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
1005                                     new ArrayBlockingQueue<Runnable>(10),
1006                                     (ThreadFactory) null,
1007                                     new NoOpREHandler());
# Line 963 | Line 1015 | public class ThreadPoolExecutorTest exte
1015      public void testInterruptedSubmit() throws InterruptedException {
1016          final ThreadPoolExecutor p =
1017              new ThreadPoolExecutor(1, 1,
1018 <                                   60, TimeUnit.SECONDS,
1018 >                                   60, SECONDS,
1019                                     new ArrayBlockingQueue<Runnable>(10));
1020  
1021 <        final CountDownLatch threadStarted = new CountDownLatch(1);
1022 <        final CountDownLatch done = new CountDownLatch(1);
1023 <        try {
1021 >        try (PoolCleaner cleaner = cleaner(p)) {
1022 >            final CountDownLatch threadStarted = new CountDownLatch(1);
1023 >            final CountDownLatch done = new CountDownLatch(1);
1024              Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1025                  public void realRun() throws Exception {
1026                      Callable task = new CheckedCallable<Boolean>() {
# Line 980 | Line 1032 | public class ThreadPoolExecutorTest exte
1032                      p.submit(task).get();
1033                  }});
1034  
1035 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
1035 >            assertTrue(threadStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
1036              t.interrupt();
1037              awaitTermination(t, MEDIUM_DELAY_MS);
986        } finally {
1038              done.countDown();
988            joinPool(p);
1039          }
1040      }
1041  
# Line 993 | Line 1043 | public class ThreadPoolExecutorTest exte
1043       * execute throws RejectedExecutionException if saturated.
1044       */
1045      public void testSaturatedExecute() {
1046 <        ThreadPoolExecutor p =
1046 >        final ThreadPoolExecutor p =
1047              new ThreadPoolExecutor(1, 1,
1048                                     LONG_DELAY_MS, MILLISECONDS,
1049                                     new ArrayBlockingQueue<Runnable>(1));
1050 <        final CountDownLatch done = new CountDownLatch(1);
1051 <        try {
1050 >        try (PoolCleaner cleaner = cleaner(p)) {
1051 >            final CountDownLatch done = new CountDownLatch(1);
1052              Runnable task = new CheckedRunnable() {
1053                  public void realRun() throws InterruptedException {
1054                      done.await();
# Line 1012 | Line 1062 | public class ThreadPoolExecutorTest exte
1062                  } catch (RejectedExecutionException success) {}
1063                  assertTrue(p.getTaskCount() <= 2);
1064              }
1015        } finally {
1065              done.countDown();
1017            joinPool(p);
1066          }
1067      }
1068  
# Line 1022 | Line 1070 | public class ThreadPoolExecutorTest exte
1070       * submit(runnable) throws RejectedExecutionException if saturated.
1071       */
1072      public void testSaturatedSubmitRunnable() {
1073 <        ThreadPoolExecutor p =
1073 >        final ThreadPoolExecutor p =
1074              new ThreadPoolExecutor(1, 1,
1075                                     LONG_DELAY_MS, MILLISECONDS,
1076                                     new ArrayBlockingQueue<Runnable>(1));
1077 <        final CountDownLatch done = new CountDownLatch(1);
1078 <        try {
1077 >        try (PoolCleaner cleaner = cleaner(p)) {
1078 >            final CountDownLatch done = new CountDownLatch(1);
1079              Runnable task = new CheckedRunnable() {
1080                  public void realRun() throws InterruptedException {
1081                      done.await();
# Line 1041 | Line 1089 | public class ThreadPoolExecutorTest exte
1089                  } catch (RejectedExecutionException success) {}
1090                  assertTrue(p.getTaskCount() <= 2);
1091              }
1044        } finally {
1092              done.countDown();
1046            joinPool(p);
1093          }
1094      }
1095  
# Line 1051 | Line 1097 | public class ThreadPoolExecutorTest exte
1097       * submit(callable) throws RejectedExecutionException if saturated.
1098       */
1099      public void testSaturatedSubmitCallable() {
1100 <        ThreadPoolExecutor p =
1100 >        final ThreadPoolExecutor p =
1101              new ThreadPoolExecutor(1, 1,
1102                                     LONG_DELAY_MS, MILLISECONDS,
1103                                     new ArrayBlockingQueue<Runnable>(1));
1104 <        final CountDownLatch done = new CountDownLatch(1);
1105 <        try {
1104 >        try (PoolCleaner cleaner = cleaner(p)) {
1105 >            final CountDownLatch done = new CountDownLatch(1);
1106              Runnable task = new CheckedRunnable() {
1107                  public void realRun() throws InterruptedException {
1108                      done.await();
# Line 1070 | Line 1116 | public class ThreadPoolExecutorTest exte
1116                  } catch (RejectedExecutionException success) {}
1117                  assertTrue(p.getTaskCount() <= 2);
1118              }
1073        } finally {
1119              done.countDown();
1075            joinPool(p);
1120          }
1121      }
1122  
# Line 1080 | Line 1124 | public class ThreadPoolExecutorTest exte
1124       * executor using CallerRunsPolicy runs task if saturated.
1125       */
1126      public void testSaturatedExecute2() {
1083        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
1127          final ThreadPoolExecutor p =
1128              new ThreadPoolExecutor(1, 1,
1129                                     LONG_DELAY_MS,
1130                                     MILLISECONDS,
1131                                     new ArrayBlockingQueue<Runnable>(1),
1132 <                                   h);
1133 <        try {
1132 >                                   new ThreadPoolExecutor.CallerRunsPolicy());
1133 >        try (PoolCleaner cleaner = cleaner(p)) {
1134 >            final CountDownLatch done = new CountDownLatch(1);
1135 >            Runnable blocker = new CheckedRunnable() {
1136 >                public void realRun() throws InterruptedException {
1137 >                    done.await();
1138 >                }};
1139 >            p.execute(blocker);
1140              TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1141 <            for (int i = 0; i < tasks.length; ++i)
1141 >            for (int i = 0; i < tasks.length; i++)
1142                  tasks[i] = new TrackedNoOpRunnable();
1143 <            TrackedLongRunnable mr = new TrackedLongRunnable();
1095 <            p.execute(mr);
1096 <            for (int i = 0; i < tasks.length; ++i)
1143 >            for (int i = 0; i < tasks.length; i++)
1144                  p.execute(tasks[i]);
1145 <            for (int i = 1; i < tasks.length; ++i)
1145 >            for (int i = 1; i < tasks.length; i++)
1146                  assertTrue(tasks[i].done);
1147 <            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1148 <        } finally {
1102 <            joinPool(p);
1147 >            assertFalse(tasks[0].done); // waiting in queue
1148 >            done.countDown();
1149          }
1150      }
1151  
# Line 1107 | Line 1153 | public class ThreadPoolExecutorTest exte
1153       * executor using DiscardPolicy drops task if saturated.
1154       */
1155      public void testSaturatedExecute3() {
1156 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
1156 >        final TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1157 >        for (int i = 0; i < tasks.length; ++i)
1158 >            tasks[i] = new TrackedNoOpRunnable();
1159          final ThreadPoolExecutor p =
1160              new ThreadPoolExecutor(1, 1,
1161 <                                   LONG_DELAY_MS, MILLISECONDS,
1162 <                                   new ArrayBlockingQueue<Runnable>(1),
1163 <                                   h);
1164 <        try {
1165 <            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1166 <            for (int i = 0; i < tasks.length; ++i)
1167 <                tasks[i] = new TrackedNoOpRunnable();
1120 <            p.execute(new TrackedLongRunnable());
1161 >                          LONG_DELAY_MS, MILLISECONDS,
1162 >                          new ArrayBlockingQueue<Runnable>(1),
1163 >                          new ThreadPoolExecutor.DiscardPolicy());
1164 >        try (PoolCleaner cleaner = cleaner(p)) {
1165 >            final CountDownLatch done = new CountDownLatch(1);
1166 >            p.execute(awaiter(done));
1167 >
1168              for (TrackedNoOpRunnable task : tasks)
1169                  p.execute(task);
1170 <            for (TrackedNoOpRunnable task : tasks)
1171 <                assertFalse(task.done);
1172 <            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1126 <        } finally {
1127 <            joinPool(p);
1170 >            for (int i = 1; i < tasks.length; i++)
1171 >                assertFalse(tasks[i].done);
1172 >            done.countDown();
1173          }
1174 +        for (int i = 1; i < tasks.length; i++)
1175 +            assertFalse(tasks[i].done);
1176 +        assertTrue(tasks[0].done); // was waiting in queue
1177      }
1178  
1179      /**
1180       * executor using DiscardOldestPolicy drops oldest task if saturated.
1181       */
1182      public void testSaturatedExecute4() {
1183 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
1183 >        final CountDownLatch done = new CountDownLatch(1);
1184 >        LatchAwaiter r1 = awaiter(done);
1185 >        LatchAwaiter r2 = awaiter(done);
1186 >        LatchAwaiter r3 = awaiter(done);
1187          final ThreadPoolExecutor p =
1188              new ThreadPoolExecutor(1, 1,
1189                                     LONG_DELAY_MS, MILLISECONDS,
1190                                     new ArrayBlockingQueue<Runnable>(1),
1191 <                                   h);
1192 <        try {
1193 <            p.execute(new TrackedLongRunnable());
1194 <            TrackedLongRunnable r2 = new TrackedLongRunnable();
1191 >                                   new ThreadPoolExecutor.DiscardOldestPolicy());
1192 >        try (PoolCleaner cleaner = cleaner(p)) {
1193 >            assertEquals(LatchAwaiter.NEW, r1.state);
1194 >            assertEquals(LatchAwaiter.NEW, r2.state);
1195 >            assertEquals(LatchAwaiter.NEW, r3.state);
1196 >            p.execute(r1);
1197              p.execute(r2);
1198              assertTrue(p.getQueue().contains(r2));
1146            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
1199              p.execute(r3);
1200              assertFalse(p.getQueue().contains(r2));
1201              assertTrue(p.getQueue().contains(r3));
1202 <            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
1151 <        } finally {
1152 <            joinPool(p);
1202 >            done.countDown();
1203          }
1204 +        assertEquals(LatchAwaiter.DONE, r1.state);
1205 +        assertEquals(LatchAwaiter.NEW, r2.state);
1206 +        assertEquals(LatchAwaiter.DONE, r3.state);
1207      }
1208  
1209      /**
1210       * execute throws RejectedExecutionException if shutdown
1211       */
1212      public void testRejectedExecutionExceptionOnShutdown() {
1213 <        ThreadPoolExecutor p =
1213 >        final ThreadPoolExecutor p =
1214              new ThreadPoolExecutor(1, 1,
1215                                     LONG_DELAY_MS, MILLISECONDS,
1216                                     new ArrayBlockingQueue<Runnable>(1));
1217          try { p.shutdown(); } catch (SecurityException ok) { return; }
1218 <        try {
1219 <            p.execute(new NoOpRunnable());
1220 <            shouldThrow();
1221 <        } catch (RejectedExecutionException success) {}
1222 <
1223 <        joinPool(p);
1218 >        try (PoolCleaner cleaner = cleaner(p)) {
1219 >            try {
1220 >                p.execute(new NoOpRunnable());
1221 >                shouldThrow();
1222 >            } catch (RejectedExecutionException success) {}
1223 >        }
1224      }
1225  
1226      /**
# Line 1181 | Line 1234 | public class ThreadPoolExecutorTest exte
1234                                     new ArrayBlockingQueue<Runnable>(1), h);
1235  
1236          try { p.shutdown(); } catch (SecurityException ok) { return; }
1237 <        try {
1237 >        try (PoolCleaner cleaner = cleaner(p)) {
1238              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1239              p.execute(r);
1240              assertFalse(r.done);
1188        } finally {
1189            joinPool(p);
1241          }
1242      }
1243  
# Line 1194 | Line 1245 | public class ThreadPoolExecutorTest exte
1245       * execute using DiscardPolicy drops task on shutdown
1246       */
1247      public void testDiscardOnShutdown() {
1248 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
1198 <        ThreadPoolExecutor p =
1248 >        final ThreadPoolExecutor p =
1249              new ThreadPoolExecutor(1, 1,
1250                                     LONG_DELAY_MS, MILLISECONDS,
1251                                     new ArrayBlockingQueue<Runnable>(1),
1252 <                                   h);
1252 >                                   new ThreadPoolExecutor.DiscardPolicy());
1253  
1254          try { p.shutdown(); } catch (SecurityException ok) { return; }
1255 <        try {
1255 >        try (PoolCleaner cleaner = cleaner(p)) {
1256              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1257              p.execute(r);
1258              assertFalse(r.done);
1209        } finally {
1210            joinPool(p);
1259          }
1260      }
1261  
1214
1262      /**
1263       * execute using DiscardOldestPolicy drops task on shutdown
1264       */
1265      public void testDiscardOldestOnShutdown() {
1266 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
1220 <        ThreadPoolExecutor p =
1266 >        final ThreadPoolExecutor p =
1267              new ThreadPoolExecutor(1, 1,
1268                                     LONG_DELAY_MS, MILLISECONDS,
1269                                     new ArrayBlockingQueue<Runnable>(1),
1270 <                                   h);
1270 >                                   new ThreadPoolExecutor.DiscardOldestPolicy());
1271  
1272          try { p.shutdown(); } catch (SecurityException ok) { return; }
1273 <        try {
1273 >        try (PoolCleaner cleaner = cleaner(p)) {
1274              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1275              p.execute(r);
1276              assertFalse(r.done);
1231        } finally {
1232            joinPool(p);
1277          }
1278      }
1279  
1236
1280      /**
1281       * execute(null) throws NPE
1282       */
1283      public void testExecuteNull() {
1284 <        ThreadPoolExecutor p =
1284 >        final ThreadPoolExecutor p =
1285              new ThreadPoolExecutor(1, 2,
1286 <                                   LONG_DELAY_MS, MILLISECONDS,
1286 >                                   1L, SECONDS,
1287                                     new ArrayBlockingQueue<Runnable>(10));
1288 <        try {
1289 <            p.execute(null);
1290 <            shouldThrow();
1291 <        } catch (NullPointerException success) {}
1292 <
1293 <        joinPool(p);
1288 >        try (PoolCleaner cleaner = cleaner(p)) {
1289 >            try {
1290 >                p.execute(null);
1291 >                shouldThrow();
1292 >            } catch (NullPointerException success) {}
1293 >        }
1294      }
1295  
1296      /**
1297       * setCorePoolSize of negative value throws IllegalArgumentException
1298       */
1299      public void testCorePoolSizeIllegalArgumentException() {
1300 <        ThreadPoolExecutor p =
1300 >        final ThreadPoolExecutor p =
1301              new ThreadPoolExecutor(1, 2,
1302                                     LONG_DELAY_MS, MILLISECONDS,
1303                                     new ArrayBlockingQueue<Runnable>(10));
1304 <        try {
1305 <            p.setCorePoolSize(-1);
1306 <            shouldThrow();
1307 <        } catch (IllegalArgumentException success) {
1308 <        } finally {
1266 <            try { p.shutdown(); } catch (SecurityException ok) { return; }
1304 >        try (PoolCleaner cleaner = cleaner(p)) {
1305 >            try {
1306 >                p.setCorePoolSize(-1);
1307 >                shouldThrow();
1308 >            } catch (IllegalArgumentException success) {}
1309          }
1268        joinPool(p);
1310      }
1311  
1312      /**
# Line 1273 | Line 1314 | public class ThreadPoolExecutorTest exte
1314       * given a value less the core pool size
1315       */
1316      public void testMaximumPoolSizeIllegalArgumentException() {
1317 <        ThreadPoolExecutor p =
1317 >        final ThreadPoolExecutor p =
1318              new ThreadPoolExecutor(2, 3,
1319                                     LONG_DELAY_MS, MILLISECONDS,
1320                                     new ArrayBlockingQueue<Runnable>(10));
1321 <        try {
1322 <            p.setMaximumPoolSize(1);
1323 <            shouldThrow();
1324 <        } catch (IllegalArgumentException success) {
1325 <        } finally {
1285 <            try { p.shutdown(); } catch (SecurityException ok) { return; }
1321 >        try (PoolCleaner cleaner = cleaner(p)) {
1322 >            try {
1323 >                p.setMaximumPoolSize(1);
1324 >                shouldThrow();
1325 >            } catch (IllegalArgumentException success) {}
1326          }
1287        joinPool(p);
1327      }
1328  
1329      /**
# Line 1292 | Line 1331 | public class ThreadPoolExecutorTest exte
1331       * if given a negative value
1332       */
1333      public void testMaximumPoolSizeIllegalArgumentException2() {
1334 <        ThreadPoolExecutor p =
1334 >        final ThreadPoolExecutor p =
1335              new ThreadPoolExecutor(2, 3,
1336                                     LONG_DELAY_MS, MILLISECONDS,
1337                                     new ArrayBlockingQueue<Runnable>(10));
1338 <        try {
1339 <            p.setMaximumPoolSize(-1);
1340 <            shouldThrow();
1341 <        } catch (IllegalArgumentException success) {
1342 <        } finally {
1304 <            try { p.shutdown(); } catch (SecurityException ok) { return; }
1338 >        try (PoolCleaner cleaner = cleaner(p)) {
1339 >            try {
1340 >                p.setMaximumPoolSize(-1);
1341 >                shouldThrow();
1342 >            } catch (IllegalArgumentException success) {}
1343          }
1306        joinPool(p);
1344      }
1345  
1346 +    /**
1347 +     * Configuration changes that allow core pool size greater than
1348 +     * max pool size result in IllegalArgumentException.
1349 +     */
1350 +    public void testPoolSizeInvariants() {
1351 +        final ThreadPoolExecutor p =
1352 +            new ThreadPoolExecutor(1, 1,
1353 +                                   LONG_DELAY_MS, MILLISECONDS,
1354 +                                   new ArrayBlockingQueue<Runnable>(10));
1355 +        try (PoolCleaner cleaner = cleaner(p)) {
1356 +            for (int s = 1; s < 5; s++) {
1357 +                p.setMaximumPoolSize(s);
1358 +                p.setCorePoolSize(s);
1359 +                try {
1360 +                    p.setMaximumPoolSize(s - 1);
1361 +                    shouldThrow();
1362 +                } catch (IllegalArgumentException success) {}
1363 +                assertEquals(s, p.getCorePoolSize());
1364 +                assertEquals(s, p.getMaximumPoolSize());
1365 +                try {
1366 +                    p.setCorePoolSize(s + 1);
1367 +                    shouldThrow();
1368 +                } catch (IllegalArgumentException success) {}
1369 +                assertEquals(s, p.getCorePoolSize());
1370 +                assertEquals(s, p.getMaximumPoolSize());
1371 +            }
1372 +        }
1373 +    }
1374  
1375      /**
1376       * setKeepAliveTime throws IllegalArgumentException
1377       * when given a negative value
1378       */
1379      public void testKeepAliveTimeIllegalArgumentException() {
1380 <        ThreadPoolExecutor p =
1380 >        final ThreadPoolExecutor p =
1381              new ThreadPoolExecutor(2, 3,
1382                                     LONG_DELAY_MS, MILLISECONDS,
1383                                     new ArrayBlockingQueue<Runnable>(10));
1384 <        try {
1385 <            p.setKeepAliveTime(-1,MILLISECONDS);
1386 <            shouldThrow();
1387 <        } catch (IllegalArgumentException success) {
1388 <        } finally {
1324 <            try { p.shutdown(); } catch (SecurityException ok) { return; }
1384 >        try (PoolCleaner cleaner = cleaner(p)) {
1385 >            try {
1386 >                p.setKeepAliveTime(-1, MILLISECONDS);
1387 >                shouldThrow();
1388 >            } catch (IllegalArgumentException success) {}
1389          }
1326        joinPool(p);
1390      }
1391  
1392      /**
# Line 1331 | Line 1394 | public class ThreadPoolExecutorTest exte
1394       */
1395      public void testTerminated() {
1396          ExtendedTPE p = new ExtendedTPE();
1397 <        try { p.shutdown(); } catch (SecurityException ok) { return; }
1398 <        assertTrue(p.terminatedCalled);
1399 <        joinPool(p);
1397 >        try (PoolCleaner cleaner = cleaner(p)) {
1398 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
1399 >            assertTrue(p.terminatedCalled());
1400 >            assertTrue(p.isShutdown());
1401 >        }
1402      }
1403  
1404      /**
# Line 1341 | Line 1406 | public class ThreadPoolExecutorTest exte
1406       */
1407      public void testBeforeAfter() throws InterruptedException {
1408          ExtendedTPE p = new ExtendedTPE();
1409 <        try {
1410 <            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1411 <            p.execute(r);
1412 <            Thread.sleep(SHORT_DELAY_MS);
1413 <            assertTrue(r.done);
1414 <            assertTrue(p.beforeCalled);
1415 <            assertTrue(p.afterCalled);
1416 <            try { p.shutdown(); } catch (SecurityException ok) { return; }
1417 <        } finally {
1418 <            joinPool(p);
1409 >        try (PoolCleaner cleaner = cleaner(p)) {
1410 >            final CountDownLatch done = new CountDownLatch(1);
1411 >            p.execute(new CheckedRunnable() {
1412 >                public void realRun() {
1413 >                    done.countDown();
1414 >                }});
1415 >            await(p.afterCalled);
1416 >            assertEquals(0, done.getCount());
1417 >            assertTrue(p.afterCalled());
1418 >            assertTrue(p.beforeCalled());
1419          }
1420      }
1421  
# Line 1358 | Line 1423 | public class ThreadPoolExecutorTest exte
1423       * completed submit of callable returns result
1424       */
1425      public void testSubmitCallable() throws Exception {
1426 <        ExecutorService e =
1426 >        final ExecutorService e =
1427              new ThreadPoolExecutor(2, 2,
1428                                     LONG_DELAY_MS, MILLISECONDS,
1429                                     new ArrayBlockingQueue<Runnable>(10));
1430 <        try {
1430 >        try (PoolCleaner cleaner = cleaner(e)) {
1431              Future<String> future = e.submit(new StringTask());
1432              String result = future.get();
1433              assertSame(TEST_STRING, result);
1369        } finally {
1370            joinPool(e);
1434          }
1435      }
1436  
# Line 1375 | Line 1438 | public class ThreadPoolExecutorTest exte
1438       * completed submit of runnable returns successfully
1439       */
1440      public void testSubmitRunnable() throws Exception {
1441 <        ExecutorService e =
1441 >        final ExecutorService e =
1442              new ThreadPoolExecutor(2, 2,
1443                                     LONG_DELAY_MS, MILLISECONDS,
1444                                     new ArrayBlockingQueue<Runnable>(10));
1445 <        try {
1445 >        try (PoolCleaner cleaner = cleaner(e)) {
1446              Future<?> future = e.submit(new NoOpRunnable());
1447              future.get();
1448              assertTrue(future.isDone());
1386        } finally {
1387            joinPool(e);
1449          }
1450      }
1451  
# Line 1392 | Line 1453 | public class ThreadPoolExecutorTest exte
1453       * completed submit of (runnable, result) returns result
1454       */
1455      public void testSubmitRunnable2() throws Exception {
1456 <        ExecutorService e =
1456 >        final ExecutorService e =
1457              new ThreadPoolExecutor(2, 2,
1458                                     LONG_DELAY_MS, MILLISECONDS,
1459                                     new ArrayBlockingQueue<Runnable>(10));
1460 <        try {
1460 >        try (PoolCleaner cleaner = cleaner(e)) {
1461              Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1462              String result = future.get();
1463              assertSame(TEST_STRING, result);
1403        } finally {
1404            joinPool(e);
1464          }
1465      }
1466  
1408
1467      /**
1468       * invokeAny(null) throws NPE
1469       */
1470      public void testInvokeAny1() throws Exception {
1471 <        ExecutorService e =
1471 >        final ExecutorService e =
1472              new ThreadPoolExecutor(2, 2,
1473                                     LONG_DELAY_MS, MILLISECONDS,
1474                                     new ArrayBlockingQueue<Runnable>(10));
1475 <        try {
1476 <            e.invokeAny(null);
1477 <            shouldThrow();
1478 <        } catch (NullPointerException success) {
1479 <        } finally {
1422 <            joinPool(e);
1475 >        try (PoolCleaner cleaner = cleaner(e)) {
1476 >            try {
1477 >                e.invokeAny(null);
1478 >                shouldThrow();
1479 >            } catch (NullPointerException success) {}
1480          }
1481      }
1482  
# Line 1427 | Line 1484 | public class ThreadPoolExecutorTest exte
1484       * invokeAny(empty collection) throws IAE
1485       */
1486      public void testInvokeAny2() throws Exception {
1487 <        ExecutorService e =
1487 >        final ExecutorService e =
1488              new ThreadPoolExecutor(2, 2,
1489                                     LONG_DELAY_MS, MILLISECONDS,
1490                                     new ArrayBlockingQueue<Runnable>(10));
1491 <        try {
1492 <            e.invokeAny(new ArrayList<Callable<String>>());
1493 <            shouldThrow();
1494 <        } catch (IllegalArgumentException success) {
1495 <        } finally {
1439 <            joinPool(e);
1491 >        try (PoolCleaner cleaner = cleaner(e)) {
1492 >            try {
1493 >                e.invokeAny(new ArrayList<Callable<String>>());
1494 >                shouldThrow();
1495 >            } catch (IllegalArgumentException success) {}
1496          }
1497      }
1498  
# Line 1449 | Line 1505 | public class ThreadPoolExecutorTest exte
1505              new ThreadPoolExecutor(2, 2,
1506                                     LONG_DELAY_MS, MILLISECONDS,
1507                                     new ArrayBlockingQueue<Runnable>(10));
1508 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1509 <        l.add(latchAwaitingStringTask(latch));
1510 <        l.add(null);
1511 <        try {
1512 <            e.invokeAny(l);
1513 <            shouldThrow();
1514 <        } catch (NullPointerException success) {
1515 <        } finally {
1508 >        try (PoolCleaner cleaner = cleaner(e)) {
1509 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1510 >            l.add(latchAwaitingStringTask(latch));
1511 >            l.add(null);
1512 >            try {
1513 >                e.invokeAny(l);
1514 >                shouldThrow();
1515 >            } catch (NullPointerException success) {}
1516              latch.countDown();
1461            joinPool(e);
1517          }
1518      }
1519  
# Line 1466 | Line 1521 | public class ThreadPoolExecutorTest exte
1521       * invokeAny(c) throws ExecutionException if no task completes
1522       */
1523      public void testInvokeAny4() throws Exception {
1524 <        ExecutorService e =
1524 >        final ExecutorService e =
1525              new ThreadPoolExecutor(2, 2,
1526                                     LONG_DELAY_MS, MILLISECONDS,
1527                                     new ArrayBlockingQueue<Runnable>(10));
1528 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1529 <        l.add(new NPETask());
1530 <        try {
1531 <            e.invokeAny(l);
1532 <            shouldThrow();
1533 <        } catch (ExecutionException success) {
1534 <            assertTrue(success.getCause() instanceof NullPointerException);
1535 <        } finally {
1536 <            joinPool(e);
1528 >        try (PoolCleaner cleaner = cleaner(e)) {
1529 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1530 >            l.add(new NPETask());
1531 >            try {
1532 >                e.invokeAny(l);
1533 >                shouldThrow();
1534 >            } catch (ExecutionException success) {
1535 >                assertTrue(success.getCause() instanceof NullPointerException);
1536 >            }
1537          }
1538      }
1539  
# Line 1486 | Line 1541 | public class ThreadPoolExecutorTest exte
1541       * invokeAny(c) returns result of some task
1542       */
1543      public void testInvokeAny5() throws Exception {
1544 <        ExecutorService e =
1544 >        final ExecutorService e =
1545              new ThreadPoolExecutor(2, 2,
1546                                     LONG_DELAY_MS, MILLISECONDS,
1547                                     new ArrayBlockingQueue<Runnable>(10));
1548 <        try {
1548 >        try (PoolCleaner cleaner = cleaner(e)) {
1549              List<Callable<String>> l = new ArrayList<Callable<String>>();
1550              l.add(new StringTask());
1551              l.add(new StringTask());
1552              String result = e.invokeAny(l);
1553              assertSame(TEST_STRING, result);
1499        } finally {
1500            joinPool(e);
1554          }
1555      }
1556  
# Line 1505 | Line 1558 | public class ThreadPoolExecutorTest exte
1558       * invokeAll(null) throws NPE
1559       */
1560      public void testInvokeAll1() throws Exception {
1561 <        ExecutorService e =
1561 >        final ExecutorService e =
1562              new ThreadPoolExecutor(2, 2,
1563                                     LONG_DELAY_MS, MILLISECONDS,
1564                                     new ArrayBlockingQueue<Runnable>(10));
1565 <        try {
1566 <            e.invokeAll(null);
1567 <            shouldThrow();
1568 <        } catch (NullPointerException success) {
1569 <        } finally {
1517 <            joinPool(e);
1565 >        try (PoolCleaner cleaner = cleaner(e)) {
1566 >            try {
1567 >                e.invokeAll(null);
1568 >                shouldThrow();
1569 >            } catch (NullPointerException success) {}
1570          }
1571      }
1572  
# Line 1522 | Line 1574 | public class ThreadPoolExecutorTest exte
1574       * invokeAll(empty collection) returns empty collection
1575       */
1576      public void testInvokeAll2() throws InterruptedException {
1577 <        ExecutorService e =
1577 >        final ExecutorService e =
1578              new ThreadPoolExecutor(2, 2,
1579                                     LONG_DELAY_MS, MILLISECONDS,
1580                                     new ArrayBlockingQueue<Runnable>(10));
1581 <        try {
1581 >        try (PoolCleaner cleaner = cleaner(e)) {
1582              List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1583              assertTrue(r.isEmpty());
1532        } finally {
1533            joinPool(e);
1584          }
1585      }
1586  
# Line 1538 | Line 1588 | public class ThreadPoolExecutorTest exte
1588       * invokeAll(c) throws NPE if c has null elements
1589       */
1590      public void testInvokeAll3() throws Exception {
1591 <        ExecutorService e =
1591 >        final ExecutorService e =
1592              new ThreadPoolExecutor(2, 2,
1593                                     LONG_DELAY_MS, MILLISECONDS,
1594                                     new ArrayBlockingQueue<Runnable>(10));
1595 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1596 <        l.add(new StringTask());
1597 <        l.add(null);
1598 <        try {
1599 <            e.invokeAll(l);
1600 <            shouldThrow();
1601 <        } catch (NullPointerException success) {
1602 <        } finally {
1553 <            joinPool(e);
1595 >        try (PoolCleaner cleaner = cleaner(e)) {
1596 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1597 >            l.add(new StringTask());
1598 >            l.add(null);
1599 >            try {
1600 >                e.invokeAll(l);
1601 >                shouldThrow();
1602 >            } catch (NullPointerException success) {}
1603          }
1604      }
1605  
# Line 1558 | Line 1607 | public class ThreadPoolExecutorTest exte
1607       * get of element of invokeAll(c) throws exception on failed task
1608       */
1609      public void testInvokeAll4() throws Exception {
1610 <        ExecutorService e =
1610 >        final ExecutorService e =
1611              new ThreadPoolExecutor(2, 2,
1612                                     LONG_DELAY_MS, MILLISECONDS,
1613                                     new ArrayBlockingQueue<Runnable>(10));
1614 <        try {
1614 >        try (PoolCleaner cleaner = cleaner(e)) {
1615              List<Callable<String>> l = new ArrayList<Callable<String>>();
1616              l.add(new NPETask());
1617              List<Future<String>> futures = e.invokeAll(l);
# Line 1573 | Line 1622 | public class ThreadPoolExecutorTest exte
1622              } catch (ExecutionException success) {
1623                  assertTrue(success.getCause() instanceof NullPointerException);
1624              }
1576        } finally {
1577            joinPool(e);
1625          }
1626      }
1627  
# Line 1582 | Line 1629 | public class ThreadPoolExecutorTest exte
1629       * invokeAll(c) returns results of all completed tasks
1630       */
1631      public void testInvokeAll5() throws Exception {
1632 <        ExecutorService e =
1632 >        final ExecutorService e =
1633              new ThreadPoolExecutor(2, 2,
1634                                     LONG_DELAY_MS, MILLISECONDS,
1635                                     new ArrayBlockingQueue<Runnable>(10));
1636 <        try {
1636 >        try (PoolCleaner cleaner = cleaner(e)) {
1637              List<Callable<String>> l = new ArrayList<Callable<String>>();
1638              l.add(new StringTask());
1639              l.add(new StringTask());
# Line 1594 | Line 1641 | public class ThreadPoolExecutorTest exte
1641              assertEquals(2, futures.size());
1642              for (Future<String> future : futures)
1643                  assertSame(TEST_STRING, future.get());
1597        } finally {
1598            joinPool(e);
1644          }
1645      }
1646  
1602
1603
1647      /**
1648       * timed invokeAny(null) throws NPE
1649       */
1650      public void testTimedInvokeAny1() throws Exception {
1651 <        ExecutorService e =
1651 >        final ExecutorService e =
1652              new ThreadPoolExecutor(2, 2,
1653                                     LONG_DELAY_MS, MILLISECONDS,
1654                                     new ArrayBlockingQueue<Runnable>(10));
1655 <        try {
1656 <            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1657 <            shouldThrow();
1658 <        } catch (NullPointerException success) {
1659 <        } finally {
1617 <            joinPool(e);
1655 >        try (PoolCleaner cleaner = cleaner(e)) {
1656 >            try {
1657 >                e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1658 >                shouldThrow();
1659 >            } catch (NullPointerException success) {}
1660          }
1661      }
1662  
# Line 1622 | Line 1664 | public class ThreadPoolExecutorTest exte
1664       * timed invokeAny(,,null) throws NPE
1665       */
1666      public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1667 <        ExecutorService e =
1667 >        final ExecutorService e =
1668              new ThreadPoolExecutor(2, 2,
1669                                     LONG_DELAY_MS, MILLISECONDS,
1670                                     new ArrayBlockingQueue<Runnable>(10));
1671 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1672 <        l.add(new StringTask());
1673 <        try {
1674 <            e.invokeAny(l, MEDIUM_DELAY_MS, null);
1675 <            shouldThrow();
1676 <        } catch (NullPointerException success) {
1677 <        } finally {
1636 <            joinPool(e);
1671 >        try (PoolCleaner cleaner = cleaner(e)) {
1672 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1673 >            l.add(new StringTask());
1674 >            try {
1675 >                e.invokeAny(l, MEDIUM_DELAY_MS, null);
1676 >                shouldThrow();
1677 >            } catch (NullPointerException success) {}
1678          }
1679      }
1680  
# Line 1641 | Line 1682 | public class ThreadPoolExecutorTest exte
1682       * timed invokeAny(empty collection) throws IAE
1683       */
1684      public void testTimedInvokeAny2() throws Exception {
1685 <        ExecutorService e =
1685 >        final ExecutorService e =
1686              new ThreadPoolExecutor(2, 2,
1687                                     LONG_DELAY_MS, MILLISECONDS,
1688                                     new ArrayBlockingQueue<Runnable>(10));
1689 <        try {
1690 <            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1691 <            shouldThrow();
1692 <        } catch (IllegalArgumentException success) {
1693 <        } finally {
1694 <            joinPool(e);
1689 >        try (PoolCleaner cleaner = cleaner(e)) {
1690 >            try {
1691 >                e.invokeAny(new ArrayList<Callable<String>>(),
1692 >                            MEDIUM_DELAY_MS, MILLISECONDS);
1693 >                shouldThrow();
1694 >            } catch (IllegalArgumentException success) {}
1695          }
1696      }
1697  
# Line 1663 | Line 1704 | public class ThreadPoolExecutorTest exte
1704              new ThreadPoolExecutor(2, 2,
1705                                     LONG_DELAY_MS, MILLISECONDS,
1706                                     new ArrayBlockingQueue<Runnable>(10));
1707 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1708 <        l.add(latchAwaitingStringTask(latch));
1709 <        l.add(null);
1710 <        try {
1711 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1712 <            shouldThrow();
1713 <        } catch (NullPointerException success) {
1714 <        } finally {
1707 >        try (PoolCleaner cleaner = cleaner(e)) {
1708 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1709 >            l.add(latchAwaitingStringTask(latch));
1710 >            l.add(null);
1711 >            try {
1712 >                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1713 >                shouldThrow();
1714 >            } catch (NullPointerException success) {}
1715              latch.countDown();
1675            joinPool(e);
1716          }
1717      }
1718  
# Line 1680 | Line 1720 | public class ThreadPoolExecutorTest exte
1720       * timed invokeAny(c) throws ExecutionException if no task completes
1721       */
1722      public void testTimedInvokeAny4() throws Exception {
1723 <        ExecutorService e =
1723 >        final ExecutorService e =
1724              new ThreadPoolExecutor(2, 2,
1725                                     LONG_DELAY_MS, MILLISECONDS,
1726                                     new ArrayBlockingQueue<Runnable>(10));
1727 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1728 <        l.add(new NPETask());
1729 <        try {
1730 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1731 <            shouldThrow();
1732 <        } catch (ExecutionException success) {
1733 <            assertTrue(success.getCause() instanceof NullPointerException);
1734 <        } finally {
1735 <            joinPool(e);
1727 >        try (PoolCleaner cleaner = cleaner(e)) {
1728 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1729 >            l.add(new NPETask());
1730 >            try {
1731 >                e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1732 >                shouldThrow();
1733 >            } catch (ExecutionException success) {
1734 >                assertTrue(success.getCause() instanceof NullPointerException);
1735 >            }
1736          }
1737      }
1738  
# Line 1700 | Line 1740 | public class ThreadPoolExecutorTest exte
1740       * timed invokeAny(c) returns result of some task
1741       */
1742      public void testTimedInvokeAny5() throws Exception {
1743 <        ExecutorService e =
1743 >        final ExecutorService e =
1744              new ThreadPoolExecutor(2, 2,
1745                                     LONG_DELAY_MS, MILLISECONDS,
1746                                     new ArrayBlockingQueue<Runnable>(10));
1747 <        try {
1747 >        try (PoolCleaner cleaner = cleaner(e)) {
1748              List<Callable<String>> l = new ArrayList<Callable<String>>();
1749              l.add(new StringTask());
1750              l.add(new StringTask());
1751              String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1752              assertSame(TEST_STRING, result);
1713        } finally {
1714            joinPool(e);
1753          }
1754      }
1755  
# Line 1719 | Line 1757 | public class ThreadPoolExecutorTest exte
1757       * timed invokeAll(null) throws NPE
1758       */
1759      public void testTimedInvokeAll1() throws Exception {
1760 <        ExecutorService e =
1760 >        final ExecutorService e =
1761              new ThreadPoolExecutor(2, 2,
1762                                     LONG_DELAY_MS, MILLISECONDS,
1763                                     new ArrayBlockingQueue<Runnable>(10));
1764 <        try {
1765 <            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1766 <            shouldThrow();
1767 <        } catch (NullPointerException success) {
1768 <        } finally {
1731 <            joinPool(e);
1764 >        try (PoolCleaner cleaner = cleaner(e)) {
1765 >            try {
1766 >                e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1767 >                shouldThrow();
1768 >            } catch (NullPointerException success) {}
1769          }
1770      }
1771  
# Line 1736 | Line 1773 | public class ThreadPoolExecutorTest exte
1773       * timed invokeAll(,,null) throws NPE
1774       */
1775      public void testTimedInvokeAllNullTimeUnit() throws Exception {
1776 <        ExecutorService e =
1776 >        final ExecutorService e =
1777              new ThreadPoolExecutor(2, 2,
1778                                     LONG_DELAY_MS, MILLISECONDS,
1779                                     new ArrayBlockingQueue<Runnable>(10));
1780 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1781 <        l.add(new StringTask());
1782 <        try {
1783 <            e.invokeAll(l, MEDIUM_DELAY_MS, null);
1784 <            shouldThrow();
1785 <        } catch (NullPointerException success) {
1786 <        } finally {
1750 <            joinPool(e);
1780 >        try (PoolCleaner cleaner = cleaner(e)) {
1781 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1782 >            l.add(new StringTask());
1783 >            try {
1784 >                e.invokeAll(l, MEDIUM_DELAY_MS, null);
1785 >                shouldThrow();
1786 >            } catch (NullPointerException success) {}
1787          }
1788      }
1789  
# Line 1755 | Line 1791 | public class ThreadPoolExecutorTest exte
1791       * timed invokeAll(empty collection) returns empty collection
1792       */
1793      public void testTimedInvokeAll2() throws InterruptedException {
1794 <        ExecutorService e =
1794 >        final ExecutorService e =
1795              new ThreadPoolExecutor(2, 2,
1796                                     LONG_DELAY_MS, MILLISECONDS,
1797                                     new ArrayBlockingQueue<Runnable>(10));
1798 <        try {
1799 <            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1798 >        try (PoolCleaner cleaner = cleaner(e)) {
1799 >            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(),
1800 >                                                 MEDIUM_DELAY_MS, MILLISECONDS);
1801              assertTrue(r.isEmpty());
1765        } finally {
1766            joinPool(e);
1802          }
1803      }
1804  
# Line 1771 | Line 1806 | public class ThreadPoolExecutorTest exte
1806       * timed invokeAll(c) throws NPE if c has null elements
1807       */
1808      public void testTimedInvokeAll3() throws Exception {
1809 <        ExecutorService e =
1809 >        final ExecutorService e =
1810              new ThreadPoolExecutor(2, 2,
1811                                     LONG_DELAY_MS, MILLISECONDS,
1812                                     new ArrayBlockingQueue<Runnable>(10));
1813 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1814 <        l.add(new StringTask());
1815 <        l.add(null);
1816 <        try {
1817 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1818 <            shouldThrow();
1819 <        } catch (NullPointerException success) {
1820 <        } finally {
1786 <            joinPool(e);
1813 >        try (PoolCleaner cleaner = cleaner(e)) {
1814 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1815 >            l.add(new StringTask());
1816 >            l.add(null);
1817 >            try {
1818 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1819 >                shouldThrow();
1820 >            } catch (NullPointerException success) {}
1821          }
1822      }
1823  
# Line 1791 | Line 1825 | public class ThreadPoolExecutorTest exte
1825       * get of element of invokeAll(c) throws exception on failed task
1826       */
1827      public void testTimedInvokeAll4() throws Exception {
1828 <        ExecutorService e =
1828 >        final ExecutorService e =
1829              new ThreadPoolExecutor(2, 2,
1830                                     LONG_DELAY_MS, MILLISECONDS,
1831                                     new ArrayBlockingQueue<Runnable>(10));
1832 <        List<Callable<String>> l = new ArrayList<Callable<String>>();
1833 <        l.add(new NPETask());
1834 <        List<Future<String>> futures =
1835 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1836 <        assertEquals(1, futures.size());
1837 <        try {
1838 <            futures.get(0).get();
1839 <            shouldThrow();
1840 <        } catch (ExecutionException success) {
1841 <            assertTrue(success.getCause() instanceof NullPointerException);
1842 <        } finally {
1843 <            joinPool(e);
1832 >        try (PoolCleaner cleaner = cleaner(e)) {
1833 >            List<Callable<String>> l = new ArrayList<Callable<String>>();
1834 >            l.add(new NPETask());
1835 >            List<Future<String>> futures =
1836 >                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1837 >            assertEquals(1, futures.size());
1838 >            try {
1839 >                futures.get(0).get();
1840 >                shouldThrow();
1841 >            } catch (ExecutionException success) {
1842 >                assertTrue(success.getCause() instanceof NullPointerException);
1843 >            }
1844          }
1845      }
1846  
# Line 1814 | Line 1848 | public class ThreadPoolExecutorTest exte
1848       * timed invokeAll(c) returns results of all completed tasks
1849       */
1850      public void testTimedInvokeAll5() throws Exception {
1851 <        ExecutorService e =
1851 >        final ExecutorService e =
1852              new ThreadPoolExecutor(2, 2,
1853                                     LONG_DELAY_MS, MILLISECONDS,
1854                                     new ArrayBlockingQueue<Runnable>(10));
1855 <        try {
1855 >        try (PoolCleaner cleaner = cleaner(e)) {
1856              List<Callable<String>> l = new ArrayList<Callable<String>>();
1857              l.add(new StringTask());
1858              l.add(new StringTask());
1859              List<Future<String>> futures =
1860 <                e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1860 >                e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1861              assertEquals(2, futures.size());
1862              for (Future<String> future : futures)
1863                  assertSame(TEST_STRING, future.get());
1830        } finally {
1831            joinPool(e);
1864          }
1865      }
1866  
# Line 1836 | Line 1868 | public class ThreadPoolExecutorTest exte
1868       * timed invokeAll(c) cancels tasks not completed by timeout
1869       */
1870      public void testTimedInvokeAll6() throws Exception {
1871 <        ExecutorService e =
1871 >        final ExecutorService e =
1872              new ThreadPoolExecutor(2, 2,
1873                                     LONG_DELAY_MS, MILLISECONDS,
1874                                     new ArrayBlockingQueue<Runnable>(10));
1875 <        try {
1876 <            List<Callable<String>> l = new ArrayList<Callable<String>>();
1877 <            l.add(new StringTask());
1878 <            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1879 <            l.add(new StringTask());
1880 <            List<Future<String>> futures =
1881 <                e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1882 <            assertEquals(3, futures.size());
1883 <            Iterator<Future<String>> it = futures.iterator();
1884 <            Future<String> f1 = it.next();
1885 <            Future<String> f2 = it.next();
1886 <            Future<String> f3 = it.next();
1887 <            assertTrue(f1.isDone());
1888 <            assertTrue(f2.isDone());
1889 <            assertTrue(f3.isDone());
1890 <            assertFalse(f1.isCancelled());
1891 <            assertTrue(f2.isCancelled());
1892 <        } finally {
1893 <            joinPool(e);
1875 >        try (PoolCleaner cleaner = cleaner(e)) {
1876 >            for (long timeout = timeoutMillis();;) {
1877 >                List<Callable<String>> tasks = new ArrayList<>();
1878 >                tasks.add(new StringTask("0"));
1879 >                tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1880 >                tasks.add(new StringTask("2"));
1881 >                long startTime = System.nanoTime();
1882 >                List<Future<String>> futures =
1883 >                    e.invokeAll(tasks, timeout, MILLISECONDS);
1884 >                assertEquals(tasks.size(), futures.size());
1885 >                assertTrue(millisElapsedSince(startTime) >= timeout);
1886 >                for (Future future : futures)
1887 >                    assertTrue(future.isDone());
1888 >                assertTrue(futures.get(1).isCancelled());
1889 >                try {
1890 >                    assertEquals("0", futures.get(0).get());
1891 >                    assertEquals("2", futures.get(2).get());
1892 >                    break;
1893 >                } catch (CancellationException retryWithLongerTimeout) {
1894 >                    timeout *= 2;
1895 >                    if (timeout >= LONG_DELAY_MS / 2)
1896 >                        fail("expected exactly one task to be cancelled");
1897 >                }
1898 >            }
1899          }
1900      }
1901  
# Line 1872 | Line 1909 | public class ThreadPoolExecutorTest exte
1909                                     LONG_DELAY_MS, MILLISECONDS,
1910                                     new LinkedBlockingQueue<Runnable>(),
1911                                     new FailingThreadFactory());
1912 <        try {
1912 >        try (PoolCleaner cleaner = cleaner(e)) {
1913              final int TASKS = 100;
1914              final CountDownLatch done = new CountDownLatch(TASKS);
1915              for (int k = 0; k < TASKS; ++k)
# Line 1881 | Line 1918 | public class ThreadPoolExecutorTest exte
1918                          done.countDown();
1919                      }});
1920              assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
1884        } finally {
1885            joinPool(e);
1921          }
1922      }
1923  
# Line 1894 | Line 1929 | public class ThreadPoolExecutorTest exte
1929              new ThreadPoolExecutor(2, 2,
1930                                     1000, MILLISECONDS,
1931                                     new ArrayBlockingQueue<Runnable>(10));
1932 <        assertFalse(p.allowsCoreThreadTimeOut());
1933 <        joinPool(p);
1932 >        try (PoolCleaner cleaner = cleaner(p)) {
1933 >            assertFalse(p.allowsCoreThreadTimeOut());
1934 >        }
1935      }
1936  
1937      /**
1938       * allowCoreThreadTimeOut(true) causes idle threads to time out
1939       */
1940      public void testAllowCoreThreadTimeOut_true() throws Exception {
1941 +        long keepAliveTime = timeoutMillis();
1942          final ThreadPoolExecutor p =
1943              new ThreadPoolExecutor(2, 10,
1944 <                                   SHORT_DELAY_MS, MILLISECONDS,
1944 >                                   keepAliveTime, MILLISECONDS,
1945                                     new ArrayBlockingQueue<Runnable>(10));
1946 <        final CountDownLatch threadStarted = new CountDownLatch(1);
1947 <        try {
1946 >        try (PoolCleaner cleaner = cleaner(p)) {
1947 >            final CountDownLatch threadStarted = new CountDownLatch(1);
1948              p.allowCoreThreadTimeOut(true);
1949              p.execute(new CheckedRunnable() {
1950 <                public void realRun() throws InterruptedException {
1950 >                public void realRun() {
1951                      threadStarted.countDown();
1952                      assertEquals(1, p.getPoolSize());
1953                  }});
1954 <            assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
1955 <            for (int i = 0; i < (MEDIUM_DELAY_MS/10); i++) {
1956 <                if (p.getPoolSize() == 0)
1957 <                    break;
1958 <                Thread.sleep(10);
1959 <            }
1954 >            await(threadStarted);
1955 >            delay(keepAliveTime);
1956 >            long startTime = System.nanoTime();
1957 >            while (p.getPoolSize() > 0
1958 >                   && millisElapsedSince(startTime) < LONG_DELAY_MS)
1959 >                Thread.yield();
1960 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1961              assertEquals(0, p.getPoolSize());
1924        } finally {
1925            joinPool(p);
1962          }
1963      }
1964  
# Line 1930 | Line 1966 | public class ThreadPoolExecutorTest exte
1966       * allowCoreThreadTimeOut(false) causes idle threads not to time out
1967       */
1968      public void testAllowCoreThreadTimeOut_false() throws Exception {
1969 +        long keepAliveTime = timeoutMillis();
1970          final ThreadPoolExecutor p =
1971              new ThreadPoolExecutor(2, 10,
1972 <                                   SHORT_DELAY_MS, MILLISECONDS,
1972 >                                   keepAliveTime, MILLISECONDS,
1973                                     new ArrayBlockingQueue<Runnable>(10));
1974 <        final CountDownLatch threadStarted = new CountDownLatch(1);
1975 <        try {
1974 >        try (PoolCleaner cleaner = cleaner(p)) {
1975 >            final CountDownLatch threadStarted = new CountDownLatch(1);
1976              p.allowCoreThreadTimeOut(false);
1977              p.execute(new CheckedRunnable() {
1978                  public void realRun() throws InterruptedException {
1979                      threadStarted.countDown();
1980                      assertTrue(p.getPoolSize() >= 1);
1981                  }});
1982 <            Thread.sleep(SMALL_DELAY_MS);
1982 >            delay(2 * keepAliveTime);
1983              assertTrue(p.getPoolSize() >= 1);
1947        } finally {
1948            joinPool(p);
1984          }
1985      }
1986  
# Line 1961 | Line 1996 | public class ThreadPoolExecutorTest exte
1996                  done.countDown();
1997              }};
1998          final ThreadPoolExecutor p =
1999 <            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
1999 >            new ThreadPoolExecutor(1, 30,
2000 >                                   60, SECONDS,
2001                                     new ArrayBlockingQueue(30));
2002 <        try {
2002 >        try (PoolCleaner cleaner = cleaner(p)) {
2003              for (int i = 0; i < nTasks; ++i) {
2004                  for (;;) {
2005                      try {
# Line 1975 | Line 2011 | public class ThreadPoolExecutorTest exte
2011              }
2012              // enough time to run all tasks
2013              assertTrue(done.await(nTasks * SHORT_DELAY_MS, MILLISECONDS));
2014 <        } finally {
2015 <            p.shutdown();
2014 >        }
2015 >    }
2016 >
2017 >    /**
2018 >     * get(cancelled task) throws CancellationException
2019 >     */
2020 >    public void testGet_cancelled() throws Exception {
2021 >        final ExecutorService e =
2022 >            new ThreadPoolExecutor(1, 1,
2023 >                                   LONG_DELAY_MS, MILLISECONDS,
2024 >                                   new LinkedBlockingQueue<Runnable>());
2025 >        try (PoolCleaner cleaner = cleaner(e)) {
2026 >            final CountDownLatch blockerStarted = new CountDownLatch(1);
2027 >            final CountDownLatch done = new CountDownLatch(1);
2028 >            final List<Future<?>> futures = new ArrayList<>();
2029 >            for (int i = 0; i < 2; i++) {
2030 >                Runnable r = new CheckedRunnable() { public void realRun()
2031 >                                                         throws Throwable {
2032 >                    blockerStarted.countDown();
2033 >                    assertTrue(done.await(2 * LONG_DELAY_MS, MILLISECONDS));
2034 >                }};
2035 >                futures.add(e.submit(r));
2036 >            }
2037 >            assertTrue(blockerStarted.await(LONG_DELAY_MS, MILLISECONDS));
2038 >            for (Future<?> future : futures) future.cancel(false);
2039 >            for (Future<?> future : futures) {
2040 >                try {
2041 >                    future.get();
2042 >                    shouldThrow();
2043 >                } catch (CancellationException success) {}
2044 >                try {
2045 >                    future.get(LONG_DELAY_MS, MILLISECONDS);
2046 >                    shouldThrow();
2047 >                } catch (CancellationException success) {}
2048 >                assertTrue(future.isCancelled());
2049 >                assertTrue(future.isDone());
2050 >            }
2051 >            done.countDown();
2052          }
2053      }
2054  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines