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.31 by jsr166, Sat Nov 21 02:07:27 2009 UTC vs.
Revision 1.122 by jsr166, Sat Jul 15 18:42:01 2017 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.Collection;
15 > import java.util.Collections;
16 > import java.util.List;
17 > import java.util.concurrent.ArrayBlockingQueue;
18 > import java.util.concurrent.BlockingQueue;
19 > import java.util.concurrent.Callable;
20 > import java.util.concurrent.CancellationException;
21 > import java.util.concurrent.CountDownLatch;
22 > import java.util.concurrent.ExecutionException;
23 > import java.util.concurrent.ExecutorService;
24 > import java.util.concurrent.Future;
25 > import java.util.concurrent.FutureTask;
26 > import java.util.concurrent.LinkedBlockingQueue;
27 > import java.util.concurrent.RejectedExecutionException;
28 > import java.util.concurrent.RejectedExecutionHandler;
29 > import java.util.concurrent.SynchronousQueue;
30 > import java.util.concurrent.ThreadFactory;
31 > import java.util.concurrent.ThreadPoolExecutor;
32 > import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
33 > import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
34 > import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
35 > import java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy;
36 > import java.util.concurrent.atomic.AtomicInteger;
37 > import java.util.concurrent.atomic.AtomicReference;
38 >
39 > import junit.framework.Test;
40 > import junit.framework.TestSuite;
41  
42   public class ThreadPoolExecutorTest extends JSR166TestCase {
43      public static void main(String[] args) {
44 <        junit.textui.TestRunner.run (suite());
44 >        main(suite(), args);
45      }
46      public static Test suite() {
47          return new TestSuite(ThreadPoolExecutorTest.class);
48      }
49  
50      static class ExtendedTPE extends ThreadPoolExecutor {
51 <        volatile boolean beforeCalled = false;
52 <        volatile boolean afterCalled = false;
53 <        volatile boolean terminatedCalled = false;
51 >        final CountDownLatch beforeCalled = new CountDownLatch(1);
52 >        final CountDownLatch afterCalled = new CountDownLatch(1);
53 >        final CountDownLatch terminatedCalled = new CountDownLatch(1);
54 >
55          public ExtendedTPE() {
56              super(1, 1, LONG_DELAY_MS, MILLISECONDS, new SynchronousQueue<Runnable>());
57          }
58          protected void beforeExecute(Thread t, Runnable r) {
59 <            beforeCalled = true;
59 >            beforeCalled.countDown();
60          }
61          protected void afterExecute(Runnable r, Throwable t) {
62 <            afterCalled = true;
62 >            afterCalled.countDown();
63          }
64          protected void terminated() {
65 <            terminatedCalled = true;
65 >            terminatedCalled.countDown();
66 >        }
67 >
68 >        public boolean beforeCalled() {
69 >            return beforeCalled.getCount() == 0;
70 >        }
71 >        public boolean afterCalled() {
72 >            return afterCalled.getCount() == 0;
73 >        }
74 >        public boolean terminatedCalled() {
75 >            return terminatedCalled.getCount() == 0;
76          }
77      }
78  
# Line 46 | Line 84 | public class ThreadPoolExecutorTest exte
84          }
85      }
86  
49
87      /**
88 <     *  execute successfully executes a runnable
88 >     * execute successfully executes a runnable
89       */
90      public void testExecute() throws InterruptedException {
91 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
92 <        try {
93 <            p1.execute(new ShortRunnable());
94 <            Thread.sleep(SMALL_DELAY_MS);
95 <        } finally {
96 <            joinPool(p1);
91 >        final ThreadPoolExecutor p =
92 >            new ThreadPoolExecutor(1, 1,
93 >                                   LONG_DELAY_MS, MILLISECONDS,
94 >                                   new ArrayBlockingQueue<Runnable>(10));
95 >        try (PoolCleaner cleaner = cleaner(p)) {
96 >            final CountDownLatch done = new CountDownLatch(1);
97 >            final Runnable task = new CheckedRunnable() {
98 >                public void realRun() { done.countDown(); }};
99 >            p.execute(task);
100 >            await(done);
101          }
102      }
103  
104      /**
105 <     *  getActiveCount increases but doesn't overestimate, when a
106 <     *  thread becomes active
105 >     * getActiveCount increases but doesn't overestimate, when a
106 >     * thread becomes active
107       */
108      public void testGetActiveCount() throws InterruptedException {
109 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
110 <        assertEquals(0, p2.getActiveCount());
111 <        p2.execute(new MediumRunnable());
112 <        Thread.sleep(SHORT_DELAY_MS);
113 <        assertEquals(1, p2.getActiveCount());
114 <        joinPool(p2);
109 >        final CountDownLatch done = new CountDownLatch(1);
110 >        final ThreadPoolExecutor p =
111 >            new ThreadPoolExecutor(2, 2,
112 >                                   LONG_DELAY_MS, MILLISECONDS,
113 >                                   new ArrayBlockingQueue<Runnable>(10));
114 >        try (PoolCleaner cleaner = cleaner(p, done)) {
115 >            final CountDownLatch threadStarted = new CountDownLatch(1);
116 >            assertEquals(0, p.getActiveCount());
117 >            p.execute(new CheckedRunnable() {
118 >                public void realRun() throws InterruptedException {
119 >                    threadStarted.countDown();
120 >                    assertEquals(1, p.getActiveCount());
121 >                    await(done);
122 >                }});
123 >            await(threadStarted);
124 >            assertEquals(1, p.getActiveCount());
125 >        }
126      }
127  
128      /**
129 <     *  prestartCoreThread starts a thread if under corePoolSize, else doesn't
129 >     * prestartCoreThread starts a thread if under corePoolSize, else doesn't
130       */
131      public void testPrestartCoreThread() {
132 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
133 <        assertEquals(0, p2.getPoolSize());
134 <        assertTrue(p2.prestartCoreThread());
135 <        assertEquals(1, p2.getPoolSize());
136 <        assertTrue(p2.prestartCoreThread());
137 <        assertEquals(2, p2.getPoolSize());
138 <        assertFalse(p2.prestartCoreThread());
139 <        assertEquals(2, p2.getPoolSize());
140 <        joinPool(p2);
132 >        final ThreadPoolExecutor p =
133 >            new ThreadPoolExecutor(2, 6,
134 >                                   LONG_DELAY_MS, MILLISECONDS,
135 >                                   new ArrayBlockingQueue<Runnable>(10));
136 >        try (PoolCleaner cleaner = cleaner(p)) {
137 >            assertEquals(0, p.getPoolSize());
138 >            assertTrue(p.prestartCoreThread());
139 >            assertEquals(1, p.getPoolSize());
140 >            assertTrue(p.prestartCoreThread());
141 >            assertEquals(2, p.getPoolSize());
142 >            assertFalse(p.prestartCoreThread());
143 >            assertEquals(2, p.getPoolSize());
144 >            p.setCorePoolSize(4);
145 >            assertTrue(p.prestartCoreThread());
146 >            assertEquals(3, p.getPoolSize());
147 >            assertTrue(p.prestartCoreThread());
148 >            assertEquals(4, p.getPoolSize());
149 >            assertFalse(p.prestartCoreThread());
150 >            assertEquals(4, p.getPoolSize());
151 >        }
152      }
153  
154      /**
155 <     *  prestartAllCoreThreads starts all corePoolSize threads
155 >     * prestartAllCoreThreads starts all corePoolSize threads
156       */
157      public void testPrestartAllCoreThreads() {
158 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
159 <        assertEquals(0, p2.getPoolSize());
160 <        p2.prestartAllCoreThreads();
161 <        assertEquals(2, p2.getPoolSize());
162 <        p2.prestartAllCoreThreads();
163 <        assertEquals(2, p2.getPoolSize());
164 <        joinPool(p2);
158 >        final ThreadPoolExecutor p =
159 >            new ThreadPoolExecutor(2, 6,
160 >                                   LONG_DELAY_MS, MILLISECONDS,
161 >                                   new ArrayBlockingQueue<Runnable>(10));
162 >        try (PoolCleaner cleaner = cleaner(p)) {
163 >            assertEquals(0, p.getPoolSize());
164 >            p.prestartAllCoreThreads();
165 >            assertEquals(2, p.getPoolSize());
166 >            p.prestartAllCoreThreads();
167 >            assertEquals(2, p.getPoolSize());
168 >            p.setCorePoolSize(4);
169 >            p.prestartAllCoreThreads();
170 >            assertEquals(4, p.getPoolSize());
171 >            p.prestartAllCoreThreads();
172 >            assertEquals(4, p.getPoolSize());
173 >        }
174      }
175  
176      /**
177 <     *   getCompletedTaskCount increases, but doesn't overestimate,
178 <     *   when tasks complete
177 >     * getCompletedTaskCount increases, but doesn't overestimate,
178 >     * when tasks complete
179       */
180      public void testGetCompletedTaskCount() throws InterruptedException {
181 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
182 <        assertEquals(0, p2.getCompletedTaskCount());
183 <        p2.execute(new ShortRunnable());
184 <        Thread.sleep(SMALL_DELAY_MS);
185 <        assertEquals(1, p2.getCompletedTaskCount());
186 <        try { p2.shutdown(); } catch (SecurityException ok) { return; }
187 <        joinPool(p2);
181 >        final ThreadPoolExecutor p =
182 >            new ThreadPoolExecutor(2, 2,
183 >                                   LONG_DELAY_MS, MILLISECONDS,
184 >                                   new ArrayBlockingQueue<Runnable>(10));
185 >        try (PoolCleaner cleaner = cleaner(p)) {
186 >            final CountDownLatch threadStarted = new CountDownLatch(1);
187 >            final CountDownLatch threadProceed = new CountDownLatch(1);
188 >            final CountDownLatch threadDone = new CountDownLatch(1);
189 >            assertEquals(0, p.getCompletedTaskCount());
190 >            p.execute(new CheckedRunnable() {
191 >                public void realRun() throws InterruptedException {
192 >                    threadStarted.countDown();
193 >                    assertEquals(0, p.getCompletedTaskCount());
194 >                    await(threadProceed);
195 >                    threadDone.countDown();
196 >                }});
197 >            await(threadStarted);
198 >            assertEquals(0, p.getCompletedTaskCount());
199 >            threadProceed.countDown();
200 >            await(threadDone);
201 >            long startTime = System.nanoTime();
202 >            while (p.getCompletedTaskCount() != 1) {
203 >                if (millisElapsedSince(startTime) > LONG_DELAY_MS)
204 >                    fail("timed out");
205 >                Thread.yield();
206 >            }
207 >        }
208      }
209  
210      /**
211 <     *   getCorePoolSize returns size given in constructor if not otherwise set
211 >     * getCorePoolSize returns size given in constructor if not otherwise set
212       */
213      public void testGetCorePoolSize() {
214 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
215 <        assertEquals(1, p1.getCorePoolSize());
216 <        joinPool(p1);
214 >        final ThreadPoolExecutor p =
215 >            new ThreadPoolExecutor(1, 1,
216 >                                   LONG_DELAY_MS, MILLISECONDS,
217 >                                   new ArrayBlockingQueue<Runnable>(10));
218 >        try (PoolCleaner cleaner = cleaner(p)) {
219 >            assertEquals(1, p.getCorePoolSize());
220 >        }
221      }
222  
223      /**
224 <     *   getKeepAliveTime returns value given in constructor if not otherwise set
224 >     * getKeepAliveTime returns value given in constructor if not otherwise set
225       */
226      public void testGetKeepAliveTime() {
227 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
228 <        assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
229 <        joinPool(p2);
227 >        final ThreadPoolExecutor p =
228 >            new ThreadPoolExecutor(2, 2,
229 >                                   1000, MILLISECONDS,
230 >                                   new ArrayBlockingQueue<Runnable>(10));
231 >        try (PoolCleaner cleaner = cleaner(p)) {
232 >            assertEquals(1, p.getKeepAliveTime(SECONDS));
233 >        }
234      }
235  
136
236      /**
237       * getThreadFactory returns factory in constructor if not set
238       */
239      public void testGetThreadFactory() {
240 <        ThreadFactory tf = new SimpleThreadFactory();
241 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), tf, new NoOpREHandler());
242 <        assertSame(tf, p.getThreadFactory());
243 <        joinPool(p);
240 >        ThreadFactory threadFactory = new SimpleThreadFactory();
241 >        final ThreadPoolExecutor p =
242 >            new ThreadPoolExecutor(1, 2,
243 >                                   LONG_DELAY_MS, MILLISECONDS,
244 >                                   new ArrayBlockingQueue<Runnable>(10),
245 >                                   threadFactory,
246 >                                   new NoOpREHandler());
247 >        try (PoolCleaner cleaner = cleaner(p)) {
248 >            assertSame(threadFactory, p.getThreadFactory());
249 >        }
250      }
251  
252      /**
253       * setThreadFactory sets the thread factory returned by getThreadFactory
254       */
255      public void testSetThreadFactory() {
256 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
257 <        ThreadFactory tf = new SimpleThreadFactory();
258 <        p.setThreadFactory(tf);
259 <        assertSame(tf, p.getThreadFactory());
260 <        joinPool(p);
256 >        final ThreadPoolExecutor p =
257 >            new ThreadPoolExecutor(1, 2,
258 >                                   LONG_DELAY_MS, MILLISECONDS,
259 >                                   new ArrayBlockingQueue<Runnable>(10));
260 >        try (PoolCleaner cleaner = cleaner(p)) {
261 >            ThreadFactory threadFactory = new SimpleThreadFactory();
262 >            p.setThreadFactory(threadFactory);
263 >            assertSame(threadFactory, p.getThreadFactory());
264 >        }
265      }
266  
158
267      /**
268       * setThreadFactory(null) throws NPE
269       */
270      public void testSetThreadFactoryNull() {
271 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
272 <        try {
273 <            p.setThreadFactory(null);
274 <            shouldThrow();
275 <        } catch (NullPointerException success) {
276 <        } finally {
277 <            joinPool(p);
271 >        final ThreadPoolExecutor p =
272 >            new ThreadPoolExecutor(1, 2,
273 >                                   LONG_DELAY_MS, MILLISECONDS,
274 >                                   new ArrayBlockingQueue<Runnable>(10));
275 >        try (PoolCleaner cleaner = cleaner(p)) {
276 >            try {
277 >                p.setThreadFactory(null);
278 >                shouldThrow();
279 >            } catch (NullPointerException success) {}
280 >        }
281 >    }
282 >
283 >    /**
284 >     * The default rejected execution handler is AbortPolicy.
285 >     */
286 >    public void testDefaultRejectedExecutionHandler() {
287 >        final ThreadPoolExecutor p =
288 >            new ThreadPoolExecutor(1, 2,
289 >                                   LONG_DELAY_MS, MILLISECONDS,
290 >                                   new ArrayBlockingQueue<Runnable>(10));
291 >        try (PoolCleaner cleaner = cleaner(p)) {
292 >            assertTrue(p.getRejectedExecutionHandler() instanceof AbortPolicy);
293          }
294      }
295  
# Line 174 | Line 297 | public class ThreadPoolExecutorTest exte
297       * getRejectedExecutionHandler returns handler in constructor if not set
298       */
299      public void testGetRejectedExecutionHandler() {
300 <        RejectedExecutionHandler h = new NoOpREHandler();
301 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), h);
302 <        assertSame(h, p.getRejectedExecutionHandler());
303 <        joinPool(p);
300 >        final RejectedExecutionHandler handler = new NoOpREHandler();
301 >        final ThreadPoolExecutor p =
302 >            new ThreadPoolExecutor(1, 2,
303 >                                   LONG_DELAY_MS, MILLISECONDS,
304 >                                   new ArrayBlockingQueue<Runnable>(10),
305 >                                   handler);
306 >        try (PoolCleaner cleaner = cleaner(p)) {
307 >            assertSame(handler, p.getRejectedExecutionHandler());
308 >        }
309      }
310  
311      /**
# Line 185 | Line 313 | public class ThreadPoolExecutorTest exte
313       * getRejectedExecutionHandler
314       */
315      public void testSetRejectedExecutionHandler() {
316 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
317 <        RejectedExecutionHandler h = new NoOpREHandler();
318 <        p.setRejectedExecutionHandler(h);
319 <        assertSame(h, p.getRejectedExecutionHandler());
320 <        joinPool(p);
316 >        final ThreadPoolExecutor p =
317 >            new ThreadPoolExecutor(1, 2,
318 >                                   LONG_DELAY_MS, MILLISECONDS,
319 >                                   new ArrayBlockingQueue<Runnable>(10));
320 >        try (PoolCleaner cleaner = cleaner(p)) {
321 >            RejectedExecutionHandler handler = new NoOpREHandler();
322 >            p.setRejectedExecutionHandler(handler);
323 >            assertSame(handler, p.getRejectedExecutionHandler());
324 >        }
325      }
326  
195
327      /**
328       * setRejectedExecutionHandler(null) throws NPE
329       */
330      public void testSetRejectedExecutionHandlerNull() {
331 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
332 <        try {
333 <            p.setRejectedExecutionHandler(null);
334 <            shouldThrow();
335 <        } catch (NullPointerException success) {
336 <        } finally {
337 <            joinPool(p);
331 >        final ThreadPoolExecutor p =
332 >            new ThreadPoolExecutor(1, 2,
333 >                                   LONG_DELAY_MS, MILLISECONDS,
334 >                                   new ArrayBlockingQueue<Runnable>(10));
335 >        try (PoolCleaner cleaner = cleaner(p)) {
336 >            try {
337 >                p.setRejectedExecutionHandler(null);
338 >                shouldThrow();
339 >            } catch (NullPointerException success) {}
340          }
341      }
342  
210
343      /**
344 <     *   getLargestPoolSize increases, but doesn't overestimate, when
345 <     *   multiple threads active
344 >     * getLargestPoolSize increases, but doesn't overestimate, when
345 >     * multiple threads active
346       */
347      public void testGetLargestPoolSize() throws InterruptedException {
348 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
349 <        assertEquals(0, p2.getLargestPoolSize());
350 <        p2.execute(new MediumRunnable());
351 <        p2.execute(new MediumRunnable());
352 <        Thread.sleep(SHORT_DELAY_MS);
353 <        assertEquals(2, p2.getLargestPoolSize());
354 <        joinPool(p2);
348 >        final int THREADS = 3;
349 >        final CountDownLatch done = new CountDownLatch(1);
350 >        final ThreadPoolExecutor p =
351 >            new ThreadPoolExecutor(THREADS, THREADS,
352 >                                   LONG_DELAY_MS, MILLISECONDS,
353 >                                   new ArrayBlockingQueue<Runnable>(10));
354 >        try (PoolCleaner cleaner = cleaner(p, done)) {
355 >            assertEquals(0, p.getLargestPoolSize());
356 >            final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
357 >            for (int i = 0; i < THREADS; i++)
358 >                p.execute(new CheckedRunnable() {
359 >                    public void realRun() throws InterruptedException {
360 >                        threadsStarted.countDown();
361 >                        await(done);
362 >                        assertEquals(THREADS, p.getLargestPoolSize());
363 >                    }});
364 >            await(threadsStarted);
365 >            assertEquals(THREADS, p.getLargestPoolSize());
366 >        }
367 >        assertEquals(THREADS, p.getLargestPoolSize());
368      }
369  
370      /**
371 <     *   getMaximumPoolSize returns value given in constructor if not
372 <     *   otherwise set
371 >     * getMaximumPoolSize returns value given in constructor if not
372 >     * otherwise set
373       */
374      public void testGetMaximumPoolSize() {
375 <        ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
376 <        assertEquals(2, p2.getMaximumPoolSize());
377 <        joinPool(p2);
375 >        final ThreadPoolExecutor p =
376 >            new ThreadPoolExecutor(2, 3,
377 >                                   LONG_DELAY_MS, MILLISECONDS,
378 >                                   new ArrayBlockingQueue<Runnable>(10));
379 >        try (PoolCleaner cleaner = cleaner(p)) {
380 >            assertEquals(3, p.getMaximumPoolSize());
381 >            p.setMaximumPoolSize(5);
382 >            assertEquals(5, p.getMaximumPoolSize());
383 >            p.setMaximumPoolSize(4);
384 >            assertEquals(4, p.getMaximumPoolSize());
385 >        }
386      }
387  
388      /**
389 <     *   getPoolSize increases, but doesn't overestimate, when threads
390 <     *   become active
389 >     * getPoolSize increases, but doesn't overestimate, when threads
390 >     * become active
391       */
392 <    public void testGetPoolSize() {
393 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
394 <        assertEquals(0, p1.getPoolSize());
395 <        p1.execute(new MediumRunnable());
396 <        assertEquals(1, p1.getPoolSize());
397 <        joinPool(p1);
392 >    public void testGetPoolSize() throws InterruptedException {
393 >        final CountDownLatch done = new CountDownLatch(1);
394 >        final ThreadPoolExecutor p =
395 >            new ThreadPoolExecutor(1, 1,
396 >                                   LONG_DELAY_MS, MILLISECONDS,
397 >                                   new ArrayBlockingQueue<Runnable>(10));
398 >        try (PoolCleaner cleaner = cleaner(p, done)) {
399 >            assertEquals(0, p.getPoolSize());
400 >            final CountDownLatch threadStarted = new CountDownLatch(1);
401 >            p.execute(new CheckedRunnable() {
402 >                public void realRun() throws InterruptedException {
403 >                    threadStarted.countDown();
404 >                    assertEquals(1, p.getPoolSize());
405 >                    await(done);
406 >                }});
407 >            await(threadStarted);
408 >            assertEquals(1, p.getPoolSize());
409 >        }
410      }
411  
412      /**
413 <     *  getTaskCount increases, but doesn't overestimate, when tasks submitted
413 >     * getTaskCount increases, but doesn't overestimate, when tasks submitted
414       */
415      public void testGetTaskCount() throws InterruptedException {
416 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
417 <        assertEquals(0, p1.getTaskCount());
418 <        p1.execute(new MediumRunnable());
419 <        Thread.sleep(SHORT_DELAY_MS);
420 <        assertEquals(1, p1.getTaskCount());
421 <        joinPool(p1);
416 >        final int TASKS = 3;
417 >        final CountDownLatch done = new CountDownLatch(1);
418 >        final ThreadPoolExecutor p =
419 >            new ThreadPoolExecutor(1, 1,
420 >                                   LONG_DELAY_MS, MILLISECONDS,
421 >                                   new ArrayBlockingQueue<Runnable>(10));
422 >        try (PoolCleaner cleaner = cleaner(p, done)) {
423 >            final CountDownLatch threadStarted = new CountDownLatch(1);
424 >            assertEquals(0, p.getTaskCount());
425 >            assertEquals(0, p.getCompletedTaskCount());
426 >            p.execute(new CheckedRunnable() {
427 >                public void realRun() throws InterruptedException {
428 >                    threadStarted.countDown();
429 >                    await(done);
430 >                }});
431 >            await(threadStarted);
432 >            assertEquals(1, p.getTaskCount());
433 >            assertEquals(0, p.getCompletedTaskCount());
434 >            for (int i = 0; i < TASKS; i++) {
435 >                assertEquals(1 + i, p.getTaskCount());
436 >                p.execute(new CheckedRunnable() {
437 >                    public void realRun() throws InterruptedException {
438 >                        threadStarted.countDown();
439 >                        assertEquals(1 + TASKS, p.getTaskCount());
440 >                        await(done);
441 >                    }});
442 >            }
443 >            assertEquals(1 + TASKS, p.getTaskCount());
444 >            assertEquals(0, p.getCompletedTaskCount());
445 >        }
446 >        assertEquals(1 + TASKS, p.getTaskCount());
447 >        assertEquals(1 + TASKS, p.getCompletedTaskCount());
448      }
449  
450      /**
451 <     *   isShutDown is false before shutdown, true after
451 >     * isShutdown is false before shutdown, true after
452       */
453      public void testIsShutdown() {
454 <
455 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
456 <        assertFalse(p1.isShutdown());
457 <        try { p1.shutdown(); } catch (SecurityException ok) { return; }
458 <        assertTrue(p1.isShutdown());
459 <        joinPool(p1);
454 >        final ThreadPoolExecutor p =
455 >            new ThreadPoolExecutor(1, 1,
456 >                                   LONG_DELAY_MS, MILLISECONDS,
457 >                                   new ArrayBlockingQueue<Runnable>(10));
458 >        try (PoolCleaner cleaner = cleaner(p)) {
459 >            assertFalse(p.isShutdown());
460 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
461 >            assertTrue(p.isShutdown());
462 >        }
463      }
464  
465 +    /**
466 +     * awaitTermination on a non-shutdown pool times out
467 +     */
468 +    public void testAwaitTermination_timesOut() throws InterruptedException {
469 +        final ThreadPoolExecutor p =
470 +            new ThreadPoolExecutor(1, 1,
471 +                                   LONG_DELAY_MS, MILLISECONDS,
472 +                                   new ArrayBlockingQueue<Runnable>(10));
473 +        try (PoolCleaner cleaner = cleaner(p)) {
474 +            assertFalse(p.isTerminated());
475 +            assertFalse(p.awaitTermination(Long.MIN_VALUE, NANOSECONDS));
476 +            assertFalse(p.awaitTermination(Long.MIN_VALUE, MILLISECONDS));
477 +            assertFalse(p.awaitTermination(-1L, NANOSECONDS));
478 +            assertFalse(p.awaitTermination(-1L, MILLISECONDS));
479 +            assertFalse(p.awaitTermination(randomExpiredTimeout(),
480 +                                           randomTimeUnit()));
481 +            long timeoutNanos = 999999L;
482 +            long startTime = System.nanoTime();
483 +            assertFalse(p.awaitTermination(timeoutNanos, NANOSECONDS));
484 +            assertTrue(System.nanoTime() - startTime >= timeoutNanos);
485 +            assertFalse(p.isTerminated());
486 +            startTime = System.nanoTime();
487 +            long timeoutMillis = timeoutMillis();
488 +            assertFalse(p.awaitTermination(timeoutMillis, MILLISECONDS));
489 +            assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
490 +            assertFalse(p.isTerminated());
491 +            try { p.shutdown(); } catch (SecurityException ok) { return; }
492 +            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
493 +            assertTrue(p.isTerminated());
494 +        }
495 +    }
496  
497      /**
498 <     *  isTerminated is false before termination, true after
498 >     * isTerminated is false before termination, true after
499       */
500      public void testIsTerminated() throws InterruptedException {
501 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
502 <        assertFalse(p1.isTerminated());
503 <        try {
504 <            p1.execute(new MediumRunnable());
505 <        } finally {
506 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
501 >        final ThreadPoolExecutor p =
502 >            new ThreadPoolExecutor(1, 1,
503 >                                   LONG_DELAY_MS, MILLISECONDS,
504 >                                   new ArrayBlockingQueue<Runnable>(10));
505 >        try (PoolCleaner cleaner = cleaner(p)) {
506 >            final CountDownLatch threadStarted = new CountDownLatch(1);
507 >            final CountDownLatch done = new CountDownLatch(1);
508 >            assertFalse(p.isTerminating());
509 >            p.execute(new CheckedRunnable() {
510 >                public void realRun() throws InterruptedException {
511 >                    assertFalse(p.isTerminating());
512 >                    threadStarted.countDown();
513 >                    await(done);
514 >                }});
515 >            await(threadStarted);
516 >            assertFalse(p.isTerminating());
517 >            done.countDown();
518 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
519 >            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
520 >            assertTrue(p.isTerminated());
521 >            assertFalse(p.isTerminating());
522          }
283        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
284        assertTrue(p1.isTerminated());
523      }
524  
525      /**
526 <     *  isTerminating is not true when running or when terminated
526 >     * isTerminating is not true when running or when terminated
527       */
528      public void testIsTerminating() throws InterruptedException {
529 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
530 <        assertFalse(p1.isTerminating());
531 <        try {
532 <            p1.execute(new SmallRunnable());
533 <            assertFalse(p1.isTerminating());
534 <        } finally {
535 <            try { p1.shutdown(); } catch (SecurityException ok) { return; }
536 <        }
537 <        assertTrue(p1.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
538 <        assertTrue(p1.isTerminated());
539 <        assertFalse(p1.isTerminating());
529 >        final ThreadPoolExecutor p =
530 >            new ThreadPoolExecutor(1, 1,
531 >                                   LONG_DELAY_MS, MILLISECONDS,
532 >                                   new ArrayBlockingQueue<Runnable>(10));
533 >        try (PoolCleaner cleaner = cleaner(p)) {
534 >            final CountDownLatch threadStarted = new CountDownLatch(1);
535 >            final CountDownLatch done = new CountDownLatch(1);
536 >            assertFalse(p.isTerminating());
537 >            p.execute(new CheckedRunnable() {
538 >                public void realRun() throws InterruptedException {
539 >                    assertFalse(p.isTerminating());
540 >                    threadStarted.countDown();
541 >                    await(done);
542 >                }});
543 >            await(threadStarted);
544 >            assertFalse(p.isTerminating());
545 >            done.countDown();
546 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
547 >            assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
548 >            assertTrue(p.isTerminated());
549 >            assertFalse(p.isTerminating());
550 >        }
551      }
552  
553      /**
554       * getQueue returns the work queue, which contains queued tasks
555       */
556      public void testGetQueue() throws InterruptedException {
557 <        BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
558 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
559 <        FutureTask[] tasks = new FutureTask[5];
560 <        for (int i = 0; i < 5; i++) {
561 <            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
562 <            p1.execute(tasks[i]);
563 <        }
564 <        try {
565 <            Thread.sleep(SHORT_DELAY_MS);
566 <            BlockingQueue<Runnable> wq = p1.getQueue();
567 <            assertSame(q, wq);
568 <            assertFalse(wq.contains(tasks[0]));
569 <            assertTrue(wq.contains(tasks[4]));
570 <            for (int i = 1; i < 5; ++i)
571 <                tasks[i].cancel(true);
572 <            p1.shutdownNow();
573 <        } finally {
574 <            joinPool(p1);
557 >        final CountDownLatch done = new CountDownLatch(1);
558 >        final BlockingQueue<Runnable> q = new ArrayBlockingQueue<>(10);
559 >        final ThreadPoolExecutor p =
560 >            new ThreadPoolExecutor(1, 1,
561 >                                   LONG_DELAY_MS, MILLISECONDS,
562 >                                   q);
563 >        try (PoolCleaner cleaner = cleaner(p, done)) {
564 >            final CountDownLatch threadStarted = new CountDownLatch(1);
565 >            FutureTask[] tasks = new FutureTask[5];
566 >            for (int i = 0; i < tasks.length; i++) {
567 >                Callable task = new CheckedCallable<Boolean>() {
568 >                    public Boolean realCall() throws InterruptedException {
569 >                        threadStarted.countDown();
570 >                        assertSame(q, p.getQueue());
571 >                        await(done);
572 >                        return Boolean.TRUE;
573 >                    }};
574 >                tasks[i] = new FutureTask(task);
575 >                p.execute(tasks[i]);
576 >            }
577 >            await(threadStarted);
578 >            assertSame(q, p.getQueue());
579 >            assertFalse(q.contains(tasks[0]));
580 >            assertTrue(q.contains(tasks[tasks.length - 1]));
581 >            assertEquals(tasks.length - 1, q.size());
582          }
583      }
584  
# Line 330 | Line 586 | public class ThreadPoolExecutorTest exte
586       * remove(task) removes queued task, and fails to remove active task
587       */
588      public void testRemove() throws InterruptedException {
589 <        BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
590 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, q);
591 <        FutureTask[] tasks = new FutureTask[5];
592 <        for (int i = 0; i < 5; i++) {
593 <            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
594 <            p1.execute(tasks[i]);
595 <        }
596 <        try {
597 <            Thread.sleep(SHORT_DELAY_MS);
598 <            assertFalse(p1.remove(tasks[0]));
589 >        final CountDownLatch done = new CountDownLatch(1);
590 >        BlockingQueue<Runnable> q = new ArrayBlockingQueue<>(10);
591 >        final ThreadPoolExecutor p =
592 >            new ThreadPoolExecutor(1, 1,
593 >                                   LONG_DELAY_MS, MILLISECONDS,
594 >                                   q);
595 >        try (PoolCleaner cleaner = cleaner(p, done)) {
596 >            Runnable[] tasks = new Runnable[6];
597 >            final CountDownLatch threadStarted = new CountDownLatch(1);
598 >            for (int i = 0; i < tasks.length; i++) {
599 >                tasks[i] = new CheckedRunnable() {
600 >                    public void realRun() throws InterruptedException {
601 >                        threadStarted.countDown();
602 >                        await(done);
603 >                    }};
604 >                p.execute(tasks[i]);
605 >            }
606 >            await(threadStarted);
607 >            assertFalse(p.remove(tasks[0]));
608              assertTrue(q.contains(tasks[4]));
609              assertTrue(q.contains(tasks[3]));
610 <            assertTrue(p1.remove(tasks[4]));
611 <            assertFalse(p1.remove(tasks[4]));
610 >            assertTrue(p.remove(tasks[4]));
611 >            assertFalse(p.remove(tasks[4]));
612              assertFalse(q.contains(tasks[4]));
613              assertTrue(q.contains(tasks[3]));
614 <            assertTrue(p1.remove(tasks[3]));
614 >            assertTrue(p.remove(tasks[3]));
615              assertFalse(q.contains(tasks[3]));
351        } finally {
352            joinPool(p1);
616          }
617      }
618  
619      /**
620 <     *   purge removes cancelled tasks from the queue
620 >     * purge removes cancelled tasks from the queue
621       */
622 <    public void testPurge() {
623 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
624 <        FutureTask[] tasks = new FutureTask[5];
625 <        for (int i = 0; i < 5; i++) {
626 <            tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
627 <            p1.execute(tasks[i]);
622 >    public void testPurge() throws InterruptedException {
623 >        final CountDownLatch threadStarted = new CountDownLatch(1);
624 >        final CountDownLatch done = new CountDownLatch(1);
625 >        final BlockingQueue<Runnable> q = new ArrayBlockingQueue<>(10);
626 >        final ThreadPoolExecutor p =
627 >            new ThreadPoolExecutor(1, 1,
628 >                                   LONG_DELAY_MS, MILLISECONDS,
629 >                                   q);
630 >        try (PoolCleaner cleaner = cleaner(p, done)) {
631 >            FutureTask[] tasks = new FutureTask[5];
632 >            for (int i = 0; i < tasks.length; i++) {
633 >                Callable task = new CheckedCallable<Boolean>() {
634 >                    public Boolean realCall() throws InterruptedException {
635 >                        threadStarted.countDown();
636 >                        await(done);
637 >                        return Boolean.TRUE;
638 >                    }};
639 >                tasks[i] = new FutureTask(task);
640 >                p.execute(tasks[i]);
641 >            }
642 >            await(threadStarted);
643 >            assertEquals(tasks.length, p.getTaskCount());
644 >            assertEquals(tasks.length - 1, q.size());
645 >            assertEquals(1L, p.getActiveCount());
646 >            assertEquals(0L, p.getCompletedTaskCount());
647 >            tasks[4].cancel(true);
648 >            tasks[3].cancel(false);
649 >            p.purge();
650 >            assertEquals(tasks.length - 3, q.size());
651 >            assertEquals(tasks.length - 2, p.getTaskCount());
652 >            p.purge();         // Nothing to do
653 >            assertEquals(tasks.length - 3, q.size());
654 >            assertEquals(tasks.length - 2, p.getTaskCount());
655          }
366        tasks[4].cancel(true);
367        tasks[3].cancel(true);
368        p1.purge();
369        long count = p1.getTaskCount();
370        assertTrue(count >= 2 && count < 5);
371        joinPool(p1);
656      }
657  
658      /**
659 <     *  shutDownNow returns a list containing tasks that were not run
660 <     */
661 <    public void testShutDownNow() {
662 <        ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
663 <        List l;
664 <        try {
665 <            for (int i = 0; i < 5; i++)
666 <                p1.execute(new MediumPossiblyInterruptedRunnable());
667 <        }
668 <        finally {
659 >     * shutdownNow returns a list containing tasks that were not run,
660 >     * and those tasks are drained from the queue
661 >     */
662 >    public void testShutdownNow() throws InterruptedException {
663 >        final int poolSize = 2;
664 >        final int count = 5;
665 >        final AtomicInteger ran = new AtomicInteger(0);
666 >        final ThreadPoolExecutor p =
667 >            new ThreadPoolExecutor(poolSize, poolSize,
668 >                                   LONG_DELAY_MS, MILLISECONDS,
669 >                                   new ArrayBlockingQueue<Runnable>(10));
670 >        final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
671 >        Runnable waiter = new CheckedRunnable() { public void realRun() {
672 >            threadsStarted.countDown();
673              try {
674 <                l = p1.shutdownNow();
675 <            } catch (SecurityException ok) { return; }
676 <
677 <        }
678 <        assertTrue(p1.isShutdown());
679 <        assertTrue(l.size() <= 4);
674 >                MILLISECONDS.sleep(2 * LONG_DELAY_MS);
675 >            } catch (InterruptedException success) {}
676 >            ran.getAndIncrement();
677 >        }};
678 >        for (int i = 0; i < count; i++)
679 >            p.execute(waiter);
680 >        await(threadsStarted);
681 >        assertEquals(poolSize, p.getActiveCount());
682 >        assertEquals(0, p.getCompletedTaskCount());
683 >        final List<Runnable> queuedTasks;
684 >        try {
685 >            queuedTasks = p.shutdownNow();
686 >        } catch (SecurityException ok) {
687 >            return; // Allowed in case test doesn't have privs
688 >        }
689 >        assertTrue(p.isShutdown());
690 >        assertTrue(p.getQueue().isEmpty());
691 >        assertEquals(count - poolSize, queuedTasks.size());
692 >        assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
693 >        assertTrue(p.isTerminated());
694 >        assertEquals(poolSize, ran.get());
695 >        assertEquals(poolSize, p.getCompletedTaskCount());
696      }
697  
698      // Exception Tests
699  
396
700      /**
701       * Constructor throws if corePoolSize argument is less than zero
702       */
703      public void testConstructor1() {
704          try {
705 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
705 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
706 >                                   new ArrayBlockingQueue<Runnable>(10));
707              shouldThrow();
708          } catch (IllegalArgumentException success) {}
709      }
# Line 409 | Line 713 | public class ThreadPoolExecutorTest exte
713       */
714      public void testConstructor2() {
715          try {
716 <            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
716 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
717 >                                   new ArrayBlockingQueue<Runnable>(10));
718              shouldThrow();
719          } catch (IllegalArgumentException success) {}
720      }
# Line 419 | Line 724 | public class ThreadPoolExecutorTest exte
724       */
725      public void testConstructor3() {
726          try {
727 <            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
727 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
728 >                                   new ArrayBlockingQueue<Runnable>(10));
729              shouldThrow();
730          } catch (IllegalArgumentException success) {}
731      }
# Line 429 | Line 735 | public class ThreadPoolExecutorTest exte
735       */
736      public void testConstructor4() {
737          try {
738 <            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
738 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
739 >                                   new ArrayBlockingQueue<Runnable>(10));
740              shouldThrow();
741          } catch (IllegalArgumentException success) {}
742      }
# Line 439 | Line 746 | public class ThreadPoolExecutorTest exte
746       */
747      public void testConstructor5() {
748          try {
749 <            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
749 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
750 >                                   new ArrayBlockingQueue<Runnable>(10));
751              shouldThrow();
752          } catch (IllegalArgumentException success) {}
753      }
# Line 449 | Line 757 | public class ThreadPoolExecutorTest exte
757       */
758      public void testConstructorNullPointerException() {
759          try {
760 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null);
760 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
761 >                                   (BlockingQueue) null);
762              shouldThrow();
763          } catch (NullPointerException success) {}
764      }
765  
457
458
766      /**
767       * Constructor throws if corePoolSize argument is less than zero
768       */
769      public void testConstructor6() {
770          try {
771 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
771 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
772 >                                   new ArrayBlockingQueue<Runnable>(10),
773 >                                   new SimpleThreadFactory());
774              shouldThrow();
775          } catch (IllegalArgumentException success) {}
776      }
# Line 471 | Line 780 | public class ThreadPoolExecutorTest exte
780       */
781      public void testConstructor7() {
782          try {
783 <            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
783 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
784 >                                   new ArrayBlockingQueue<Runnable>(10),
785 >                                   new SimpleThreadFactory());
786              shouldThrow();
787          } catch (IllegalArgumentException success) {}
788      }
# Line 481 | Line 792 | public class ThreadPoolExecutorTest exte
792       */
793      public void testConstructor8() {
794          try {
795 <            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
795 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
796 >                                   new ArrayBlockingQueue<Runnable>(10),
797 >                                   new SimpleThreadFactory());
798              shouldThrow();
799          } catch (IllegalArgumentException success) {}
800      }
# Line 491 | Line 804 | public class ThreadPoolExecutorTest exte
804       */
805      public void testConstructor9() {
806          try {
807 <            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
807 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
808 >                                   new ArrayBlockingQueue<Runnable>(10),
809 >                                   new SimpleThreadFactory());
810              shouldThrow();
811          } catch (IllegalArgumentException success) {}
812      }
# Line 501 | Line 816 | public class ThreadPoolExecutorTest exte
816       */
817      public void testConstructor10() {
818          try {
819 <            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
819 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
820 >                                   new ArrayBlockingQueue<Runnable>(10),
821 >                                   new SimpleThreadFactory());
822              shouldThrow();
823          } catch (IllegalArgumentException success) {}
824      }
# Line 511 | Line 828 | public class ThreadPoolExecutorTest exte
828       */
829      public void testConstructorNullPointerException2() {
830          try {
831 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new SimpleThreadFactory());
831 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
832 >                                   (BlockingQueue) null,
833 >                                   new SimpleThreadFactory());
834              shouldThrow();
835          } catch (NullPointerException success) {}
836      }
# Line 521 | Line 840 | public class ThreadPoolExecutorTest exte
840       */
841      public void testConstructorNullPointerException3() {
842          try {
843 <            ThreadFactory f = null;
844 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
843 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
844 >                                   new ArrayBlockingQueue<Runnable>(10),
845 >                                   (ThreadFactory) null);
846              shouldThrow();
847          } catch (NullPointerException success) {}
848      }
849  
530
850      /**
851       * Constructor throws if corePoolSize argument is less than zero
852       */
853      public void testConstructor11() {
854          try {
855 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
855 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
856 >                                   new ArrayBlockingQueue<Runnable>(10),
857 >                                   new NoOpREHandler());
858              shouldThrow();
859          } catch (IllegalArgumentException success) {}
860      }
# Line 543 | Line 864 | public class ThreadPoolExecutorTest exte
864       */
865      public void testConstructor12() {
866          try {
867 <            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
867 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
868 >                                   new ArrayBlockingQueue<Runnable>(10),
869 >                                   new NoOpREHandler());
870              shouldThrow();
871          } catch (IllegalArgumentException success) {}
872      }
# Line 553 | Line 876 | public class ThreadPoolExecutorTest exte
876       */
877      public void testConstructor13() {
878          try {
879 <            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
879 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
880 >                                   new ArrayBlockingQueue<Runnable>(10),
881 >                                   new NoOpREHandler());
882              shouldThrow();
883          } catch (IllegalArgumentException success) {}
884      }
# Line 563 | Line 888 | public class ThreadPoolExecutorTest exte
888       */
889      public void testConstructor14() {
890          try {
891 <            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
891 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
892 >                                   new ArrayBlockingQueue<Runnable>(10),
893 >                                   new NoOpREHandler());
894              shouldThrow();
895          } catch (IllegalArgumentException success) {}
896      }
# Line 573 | Line 900 | public class ThreadPoolExecutorTest exte
900       */
901      public void testConstructor15() {
902          try {
903 <            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
903 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
904 >                                   new ArrayBlockingQueue<Runnable>(10),
905 >                                   new NoOpREHandler());
906              shouldThrow();
907          } catch (IllegalArgumentException success) {}
908      }
# Line 583 | Line 912 | public class ThreadPoolExecutorTest exte
912       */
913      public void testConstructorNullPointerException4() {
914          try {
915 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new NoOpREHandler());
915 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
916 >                                   (BlockingQueue) null,
917 >                                   new NoOpREHandler());
918              shouldThrow();
919          } catch (NullPointerException success) {}
920      }
# Line 593 | Line 924 | public class ThreadPoolExecutorTest exte
924       */
925      public void testConstructorNullPointerException5() {
926          try {
927 <            RejectedExecutionHandler r = null;
928 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
927 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
928 >                                   new ArrayBlockingQueue<Runnable>(10),
929 >                                   (RejectedExecutionHandler) null);
930              shouldThrow();
931          } catch (NullPointerException success) {}
932      }
933  
602
934      /**
935       * Constructor throws if corePoolSize argument is less than zero
936       */
937      public void testConstructor16() {
938          try {
939 <            new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
939 >            new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
940 >                                   new ArrayBlockingQueue<Runnable>(10),
941 >                                   new SimpleThreadFactory(),
942 >                                   new NoOpREHandler());
943              shouldThrow();
944          } catch (IllegalArgumentException success) {}
945      }
# Line 615 | Line 949 | public class ThreadPoolExecutorTest exte
949       */
950      public void testConstructor17() {
951          try {
952 <            new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
952 >            new ThreadPoolExecutor(1, -1, 1L, SECONDS,
953 >                                   new ArrayBlockingQueue<Runnable>(10),
954 >                                   new SimpleThreadFactory(),
955 >                                   new NoOpREHandler());
956              shouldThrow();
957          } catch (IllegalArgumentException success) {}
958      }
# Line 625 | Line 962 | public class ThreadPoolExecutorTest exte
962       */
963      public void testConstructor18() {
964          try {
965 <            new ThreadPoolExecutor(1,0,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
965 >            new ThreadPoolExecutor(1, 0, 1L, SECONDS,
966 >                                   new ArrayBlockingQueue<Runnable>(10),
967 >                                   new SimpleThreadFactory(),
968 >                                   new NoOpREHandler());
969              shouldThrow();
970          } catch (IllegalArgumentException success) {}
971      }
# Line 635 | Line 975 | public class ThreadPoolExecutorTest exte
975       */
976      public void testConstructor19() {
977          try {
978 <            new ThreadPoolExecutor(1,2,-1L,MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
978 >            new ThreadPoolExecutor(1, 2, -1L, SECONDS,
979 >                                   new ArrayBlockingQueue<Runnable>(10),
980 >                                   new SimpleThreadFactory(),
981 >                                   new NoOpREHandler());
982              shouldThrow();
983          } catch (IllegalArgumentException success) {}
984      }
# Line 645 | Line 988 | public class ThreadPoolExecutorTest exte
988       */
989      public void testConstructor20() {
990          try {
991 <            new ThreadPoolExecutor(2,1,LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
991 >            new ThreadPoolExecutor(2, 1, 1L, SECONDS,
992 >                                   new ArrayBlockingQueue<Runnable>(10),
993 >                                   new SimpleThreadFactory(),
994 >                                   new NoOpREHandler());
995              shouldThrow();
996          } catch (IllegalArgumentException success) {}
997      }
998  
999      /**
1000 <     * Constructor throws if workQueue is set to null
1000 >     * Constructor throws if workQueue is null
1001       */
1002      public void testConstructorNullPointerException6() {
1003          try {
1004 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
1004 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
1005 >                                   (BlockingQueue) null,
1006 >                                   new SimpleThreadFactory(),
1007 >                                   new NoOpREHandler());
1008              shouldThrow();
1009          } catch (NullPointerException success) {}
1010      }
1011  
1012      /**
1013 <     * Constructor throws if handler is set to null
1013 >     * Constructor throws if handler is null
1014       */
1015      public void testConstructorNullPointerException7() {
1016          try {
1017 <            RejectedExecutionHandler r = null;
1018 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),r);
1017 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
1018 >                                   new ArrayBlockingQueue<Runnable>(10),
1019 >                                   new SimpleThreadFactory(),
1020 >                                   (RejectedExecutionHandler) null);
1021              shouldThrow();
1022          } catch (NullPointerException success) {}
1023      }
1024  
1025      /**
1026 <     * Constructor throws if ThreadFactory is set top null
1026 >     * Constructor throws if ThreadFactory is null
1027       */
1028      public void testConstructorNullPointerException8() {
1029          try {
1030 <            ThreadFactory f = null;
1031 <            new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new NoOpREHandler());
1030 >            new ThreadPoolExecutor(1, 2, 1L, SECONDS,
1031 >                                   new ArrayBlockingQueue<Runnable>(10),
1032 >                                   (ThreadFactory) null,
1033 >                                   new NoOpREHandler());
1034              shouldThrow();
1035          } catch (NullPointerException success) {}
1036      }
1037  
1038 +    /**
1039 +     * get of submitted callable throws InterruptedException if interrupted
1040 +     */
1041 +    public void testInterruptedSubmit() throws InterruptedException {
1042 +        final CountDownLatch done = new CountDownLatch(1);
1043 +        final ThreadPoolExecutor p =
1044 +            new ThreadPoolExecutor(1, 1,
1045 +                                   60, SECONDS,
1046 +                                   new ArrayBlockingQueue<Runnable>(10));
1047 +
1048 +        try (PoolCleaner cleaner = cleaner(p, done)) {
1049 +            final CountDownLatch threadStarted = new CountDownLatch(1);
1050 +            Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1051 +                public void realRun() throws Exception {
1052 +                    Callable task = new CheckedCallable<Boolean>() {
1053 +                        public Boolean realCall() throws InterruptedException {
1054 +                            threadStarted.countDown();
1055 +                            await(done);
1056 +                            return Boolean.TRUE;
1057 +                        }};
1058 +                    p.submit(task).get();
1059 +                }});
1060 +
1061 +            await(threadStarted);
1062 +            t.interrupt();
1063 +            awaitTermination(t);
1064 +        }
1065 +    }
1066  
1067      /**
1068 <     *  execute throws RejectedExecutionException
688 <     *  if saturated.
1068 >     * execute throws RejectedExecutionException if saturated.
1069       */
1070      public void testSaturatedExecute() {
1071 <        ThreadPoolExecutor p =
1071 >        final CountDownLatch done = new CountDownLatch(1);
1072 >        final ThreadPoolExecutor p =
1073              new ThreadPoolExecutor(1, 1,
1074                                     LONG_DELAY_MS, MILLISECONDS,
1075                                     new ArrayBlockingQueue<Runnable>(1));
1076 <        try {
1076 >        try (PoolCleaner cleaner = cleaner(p, done)) {
1077 >            Runnable task = new CheckedRunnable() {
1078 >                public void realRun() throws InterruptedException {
1079 >                    await(done);
1080 >                }};
1081              for (int i = 0; i < 2; ++i)
1082 <                p.execute(new MediumRunnable());
1082 >                p.execute(task);
1083              for (int i = 0; i < 2; ++i) {
1084                  try {
1085 <                    p.execute(new MediumRunnable());
1085 >                    p.execute(task);
1086                      shouldThrow();
1087                  } catch (RejectedExecutionException success) {}
1088 +                assertTrue(p.getTaskCount() <= 2);
1089              }
704        } finally {
705            joinPool(p);
1090          }
1091      }
1092  
1093      /**
1094 <     *  executor using CallerRunsPolicy runs task if saturated.
1094 >     * submit(runnable) throws RejectedExecutionException if saturated.
1095       */
1096 <    public void testSaturatedExecute2() {
1097 <        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
1098 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1099 <        try {
1096 >    public void testSaturatedSubmitRunnable() {
1097 >        final CountDownLatch done = new CountDownLatch(1);
1098 >        final ThreadPoolExecutor p =
1099 >            new ThreadPoolExecutor(1, 1,
1100 >                                   LONG_DELAY_MS, MILLISECONDS,
1101 >                                   new ArrayBlockingQueue<Runnable>(1));
1102 >        try (PoolCleaner cleaner = cleaner(p, done)) {
1103 >            Runnable task = new CheckedRunnable() {
1104 >                public void realRun() throws InterruptedException {
1105 >                    await(done);
1106 >                }};
1107 >            for (int i = 0; i < 2; ++i)
1108 >                p.submit(task);
1109 >            for (int i = 0; i < 2; ++i) {
1110 >                try {
1111 >                    p.execute(task);
1112 >                    shouldThrow();
1113 >                } catch (RejectedExecutionException success) {}
1114 >                assertTrue(p.getTaskCount() <= 2);
1115 >            }
1116 >        }
1117 >    }
1118 >
1119 >    /**
1120 >     * submit(callable) throws RejectedExecutionException if saturated.
1121 >     */
1122 >    public void testSaturatedSubmitCallable() {
1123 >        final CountDownLatch done = new CountDownLatch(1);
1124 >        final ThreadPoolExecutor p =
1125 >            new ThreadPoolExecutor(1, 1,
1126 >                                   LONG_DELAY_MS, MILLISECONDS,
1127 >                                   new ArrayBlockingQueue<Runnable>(1));
1128 >        try (PoolCleaner cleaner = cleaner(p, done)) {
1129 >            Runnable task = new CheckedRunnable() {
1130 >                public void realRun() throws InterruptedException {
1131 >                    await(done);
1132 >                }};
1133 >            for (int i = 0; i < 2; ++i)
1134 >                p.execute(task);
1135 >            for (int i = 0; i < 2; ++i) {
1136 >                try {
1137 >                    p.execute(task);
1138 >                    shouldThrow();
1139 >                } catch (RejectedExecutionException success) {}
1140 >                assertTrue(p.getTaskCount() <= 2);
1141 >            }
1142 >        }
1143 >    }
1144  
1145 +    /**
1146 +     * executor using CallerRunsPolicy runs task if saturated.
1147 +     */
1148 +    public void testSaturatedExecute2() {
1149 +        final ThreadPoolExecutor p =
1150 +            new ThreadPoolExecutor(1, 1,
1151 +                                   LONG_DELAY_MS,
1152 +                                   MILLISECONDS,
1153 +                                   new ArrayBlockingQueue<Runnable>(1),
1154 +                                   new CallerRunsPolicy());
1155 +        try (PoolCleaner cleaner = cleaner(p)) {
1156 +            final CountDownLatch done = new CountDownLatch(1);
1157 +            Runnable blocker = new CheckedRunnable() {
1158 +                public void realRun() throws InterruptedException {
1159 +                    await(done);
1160 +                }};
1161 +            p.execute(blocker);
1162              TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1163 <            for (int i = 0; i < 5; ++i) {
1163 >            for (int i = 0; i < tasks.length; i++)
1164                  tasks[i] = new TrackedNoOpRunnable();
1165 <            }
721 <            TrackedLongRunnable mr = new TrackedLongRunnable();
722 <            p.execute(mr);
723 <            for (int i = 0; i < 5; ++i) {
1165 >            for (int i = 0; i < tasks.length; i++)
1166                  p.execute(tasks[i]);
1167 <            }
726 <            for (int i = 1; i < 5; ++i) {
1167 >            for (int i = 1; i < tasks.length; i++)
1168                  assertTrue(tasks[i].done);
1169 <            }
1170 <            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
730 <        } finally {
731 <            joinPool(p);
1169 >            assertFalse(tasks[0].done); // waiting in queue
1170 >            done.countDown();
1171          }
1172      }
1173  
1174      /**
1175 <     *  executor using DiscardPolicy drops task if saturated.
1175 >     * executor using DiscardPolicy drops task if saturated.
1176       */
1177      public void testSaturatedExecute3() {
1178 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
1179 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1180 <        try {
1181 <
1182 <            TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1183 <            for (int i = 0; i < 5; ++i) {
1184 <                tasks[i] = new TrackedNoOpRunnable();
1185 <            }
1186 <            p.execute(new TrackedLongRunnable());
1187 <            for (int i = 0; i < 5; ++i) {
1188 <                p.execute(tasks[i]);
1189 <            }
1190 <            for (int i = 0; i < 5; ++i) {
1178 >        final CountDownLatch done = new CountDownLatch(1);
1179 >        final TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1180 >        for (int i = 0; i < tasks.length; ++i)
1181 >            tasks[i] = new TrackedNoOpRunnable();
1182 >        final ThreadPoolExecutor p =
1183 >            new ThreadPoolExecutor(1, 1,
1184 >                          LONG_DELAY_MS, MILLISECONDS,
1185 >                          new ArrayBlockingQueue<Runnable>(1),
1186 >                          new DiscardPolicy());
1187 >        try (PoolCleaner cleaner = cleaner(p, done)) {
1188 >            p.execute(awaiter(done));
1189 >
1190 >            for (TrackedNoOpRunnable task : tasks)
1191 >                p.execute(task);
1192 >            for (int i = 1; i < tasks.length; i++)
1193                  assertFalse(tasks[i].done);
753            }
754            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
755        } finally {
756            joinPool(p);
1194          }
1195 +        for (int i = 1; i < tasks.length; i++)
1196 +            assertFalse(tasks[i].done);
1197 +        assertTrue(tasks[0].done); // was waiting in queue
1198      }
1199  
1200      /**
1201 <     *  executor using DiscardOldestPolicy drops oldest task if saturated.
1201 >     * executor using DiscardOldestPolicy drops oldest task if saturated.
1202       */
1203      public void testSaturatedExecute4() {
1204 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
1205 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1206 <        try {
1207 <            p.execute(new TrackedLongRunnable());
1208 <            TrackedLongRunnable r2 = new TrackedLongRunnable();
1204 >        final CountDownLatch done = new CountDownLatch(1);
1205 >        LatchAwaiter r1 = awaiter(done);
1206 >        LatchAwaiter r2 = awaiter(done);
1207 >        LatchAwaiter r3 = awaiter(done);
1208 >        final ThreadPoolExecutor p =
1209 >            new ThreadPoolExecutor(1, 1,
1210 >                                   LONG_DELAY_MS, MILLISECONDS,
1211 >                                   new ArrayBlockingQueue<Runnable>(1),
1212 >                                   new DiscardOldestPolicy());
1213 >        try (PoolCleaner cleaner = cleaner(p, done)) {
1214 >            assertEquals(LatchAwaiter.NEW, r1.state);
1215 >            assertEquals(LatchAwaiter.NEW, r2.state);
1216 >            assertEquals(LatchAwaiter.NEW, r3.state);
1217 >            p.execute(r1);
1218              p.execute(r2);
1219              assertTrue(p.getQueue().contains(r2));
771            TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
1220              p.execute(r3);
1221              assertFalse(p.getQueue().contains(r2));
1222              assertTrue(p.getQueue().contains(r3));
775            try { p.shutdownNow(); } catch (SecurityException ok) { return; }
776        } finally {
777            joinPool(p);
1223          }
1224 +        assertEquals(LatchAwaiter.DONE, r1.state);
1225 +        assertEquals(LatchAwaiter.NEW, r2.state);
1226 +        assertEquals(LatchAwaiter.DONE, r3.state);
1227      }
1228  
1229      /**
1230 <     *  execute throws RejectedExecutionException if shutdown
1230 >     * execute throws RejectedExecutionException if shutdown
1231       */
1232      public void testRejectedExecutionExceptionOnShutdown() {
1233 <        ThreadPoolExecutor tpe =
1234 <            new ThreadPoolExecutor(1,1,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
1235 <        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1236 <        try {
1237 <            tpe.execute(new NoOpRunnable());
1238 <            shouldThrow();
1239 <        } catch (RejectedExecutionException success) {}
1240 <
1241 <        joinPool(tpe);
1233 >        final ThreadPoolExecutor p =
1234 >            new ThreadPoolExecutor(1, 1,
1235 >                                   LONG_DELAY_MS, MILLISECONDS,
1236 >                                   new ArrayBlockingQueue<Runnable>(1));
1237 >        try { p.shutdown(); } catch (SecurityException ok) { return; }
1238 >        try (PoolCleaner cleaner = cleaner(p)) {
1239 >            try {
1240 >                p.execute(new NoOpRunnable());
1241 >                shouldThrow();
1242 >            } catch (RejectedExecutionException success) {}
1243 >        }
1244      }
1245  
1246      /**
1247 <     *  execute using CallerRunsPolicy drops task on shutdown
1247 >     * execute using CallerRunsPolicy drops task on shutdown
1248       */
1249      public void testCallerRunsOnShutdown() {
1250 <        RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
1251 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1250 >        RejectedExecutionHandler h = new CallerRunsPolicy();
1251 >        final ThreadPoolExecutor p =
1252 >            new ThreadPoolExecutor(1, 1,
1253 >                                   LONG_DELAY_MS, MILLISECONDS,
1254 >                                   new ArrayBlockingQueue<Runnable>(1), h);
1255  
1256          try { p.shutdown(); } catch (SecurityException ok) { return; }
1257 <        try {
1257 >        try (PoolCleaner cleaner = cleaner(p)) {
1258              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1259              p.execute(r);
1260              assertFalse(r.done);
808        } finally {
809            joinPool(p);
1261          }
1262      }
1263  
1264      /**
1265 <     *  execute using DiscardPolicy drops task on shutdown
1265 >     * execute using DiscardPolicy drops task on shutdown
1266       */
1267      public void testDiscardOnShutdown() {
1268 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
1269 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1268 >        final ThreadPoolExecutor p =
1269 >            new ThreadPoolExecutor(1, 1,
1270 >                                   LONG_DELAY_MS, MILLISECONDS,
1271 >                                   new ArrayBlockingQueue<Runnable>(1),
1272 >                                   new DiscardPolicy());
1273  
1274          try { p.shutdown(); } catch (SecurityException ok) { return; }
1275 <        try {
1275 >        try (PoolCleaner cleaner = cleaner(p)) {
1276              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1277              p.execute(r);
1278              assertFalse(r.done);
825        } finally {
826            joinPool(p);
1279          }
1280      }
1281  
830
1282      /**
1283 <     *  execute using DiscardOldestPolicy drops task on shutdown
1283 >     * execute using DiscardOldestPolicy drops task on shutdown
1284       */
1285      public void testDiscardOldestOnShutdown() {
1286 <        RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
1287 <        ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
1286 >        final ThreadPoolExecutor p =
1287 >            new ThreadPoolExecutor(1, 1,
1288 >                                   LONG_DELAY_MS, MILLISECONDS,
1289 >                                   new ArrayBlockingQueue<Runnable>(1),
1290 >                                   new DiscardOldestPolicy());
1291  
1292          try { p.shutdown(); } catch (SecurityException ok) { return; }
1293 <        try {
1293 >        try (PoolCleaner cleaner = cleaner(p)) {
1294              TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1295              p.execute(r);
1296              assertFalse(r.done);
843        } finally {
844            joinPool(p);
1297          }
1298      }
1299  
848
1300      /**
1301 <     *  execute (null) throws NPE
1301 >     * execute(null) throws NPE
1302       */
1303      public void testExecuteNull() {
1304 <        ThreadPoolExecutor tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1305 <        try {
1306 <            tpe.execute(null);
1307 <            shouldThrow();
1308 <        } catch (NullPointerException success) {}
1309 <
1310 <        joinPool(tpe);
1304 >        final ThreadPoolExecutor p =
1305 >            new ThreadPoolExecutor(1, 2,
1306 >                                   1L, SECONDS,
1307 >                                   new ArrayBlockingQueue<Runnable>(10));
1308 >        try (PoolCleaner cleaner = cleaner(p)) {
1309 >            try {
1310 >                p.execute(null);
1311 >                shouldThrow();
1312 >            } catch (NullPointerException success) {}
1313 >        }
1314      }
1315  
1316      /**
1317 <     *  setCorePoolSize of negative value throws IllegalArgumentException
1317 >     * setCorePoolSize of negative value throws IllegalArgumentException
1318       */
1319      public void testCorePoolSizeIllegalArgumentException() {
1320 <        ThreadPoolExecutor tpe =
1320 >        final ThreadPoolExecutor p =
1321              new ThreadPoolExecutor(1, 2,
1322                                     LONG_DELAY_MS, MILLISECONDS,
1323                                     new ArrayBlockingQueue<Runnable>(10));
1324 <        try {
1325 <            tpe.setCorePoolSize(-1);
1326 <            shouldThrow();
1327 <        } catch (IllegalArgumentException success) {
1328 <        } finally {
875 <            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1324 >        try (PoolCleaner cleaner = cleaner(p)) {
1325 >            try {
1326 >                p.setCorePoolSize(-1);
1327 >                shouldThrow();
1328 >            } catch (IllegalArgumentException success) {}
1329          }
877        joinPool(tpe);
1330      }
1331  
1332      /**
1333 <     *  setMaximumPoolSize(int) throws IllegalArgumentException if
1334 <     *  given a value less the core pool size
1333 >     * setMaximumPoolSize(int) throws IllegalArgumentException if
1334 >     * given a value less the core pool size
1335       */
1336      public void testMaximumPoolSizeIllegalArgumentException() {
1337 <        ThreadPoolExecutor tpe =
1337 >        final ThreadPoolExecutor p =
1338              new ThreadPoolExecutor(2, 3,
1339                                     LONG_DELAY_MS, MILLISECONDS,
1340                                     new ArrayBlockingQueue<Runnable>(10));
1341 <        try {
1342 <            tpe.setMaximumPoolSize(1);
1343 <            shouldThrow();
1344 <        } catch (IllegalArgumentException success) {
1345 <        } finally {
894 <            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1341 >        try (PoolCleaner cleaner = cleaner(p)) {
1342 >            try {
1343 >                p.setMaximumPoolSize(1);
1344 >                shouldThrow();
1345 >            } catch (IllegalArgumentException success) {}
1346          }
896        joinPool(tpe);
1347      }
1348  
1349      /**
1350 <     *  setMaximumPoolSize throws IllegalArgumentException
1351 <     *  if given a negative value
1350 >     * setMaximumPoolSize throws IllegalArgumentException
1351 >     * if given a negative value
1352       */
1353      public void testMaximumPoolSizeIllegalArgumentException2() {
1354 <        ThreadPoolExecutor tpe =
1354 >        final ThreadPoolExecutor p =
1355              new ThreadPoolExecutor(2, 3,
1356                                     LONG_DELAY_MS, MILLISECONDS,
1357                                     new ArrayBlockingQueue<Runnable>(10));
1358 <        try {
1359 <            tpe.setMaximumPoolSize(-1);
1360 <            shouldThrow();
1361 <        } catch (IllegalArgumentException success) {
1362 <        } finally {
913 <            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1358 >        try (PoolCleaner cleaner = cleaner(p)) {
1359 >            try {
1360 >                p.setMaximumPoolSize(-1);
1361 >                shouldThrow();
1362 >            } catch (IllegalArgumentException success) {}
1363          }
915        joinPool(tpe);
1364      }
1365  
1366 +    /**
1367 +     * Configuration changes that allow core pool size greater than
1368 +     * max pool size result in IllegalArgumentException.
1369 +     */
1370 +    public void testPoolSizeInvariants() {
1371 +        final ThreadPoolExecutor p =
1372 +            new ThreadPoolExecutor(1, 1,
1373 +                                   LONG_DELAY_MS, MILLISECONDS,
1374 +                                   new ArrayBlockingQueue<Runnable>(10));
1375 +        try (PoolCleaner cleaner = cleaner(p)) {
1376 +            for (int s = 1; s < 5; s++) {
1377 +                p.setMaximumPoolSize(s);
1378 +                p.setCorePoolSize(s);
1379 +                try {
1380 +                    p.setMaximumPoolSize(s - 1);
1381 +                    shouldThrow();
1382 +                } catch (IllegalArgumentException success) {}
1383 +                assertEquals(s, p.getCorePoolSize());
1384 +                assertEquals(s, p.getMaximumPoolSize());
1385 +                try {
1386 +                    p.setCorePoolSize(s + 1);
1387 +                    shouldThrow();
1388 +                } catch (IllegalArgumentException success) {}
1389 +                assertEquals(s, p.getCorePoolSize());
1390 +                assertEquals(s, p.getMaximumPoolSize());
1391 +            }
1392 +        }
1393 +    }
1394  
1395      /**
1396 <     *  setKeepAliveTime  throws IllegalArgumentException
1397 <     *  when given a negative value
1396 >     * setKeepAliveTime throws IllegalArgumentException
1397 >     * when given a negative value
1398       */
1399      public void testKeepAliveTimeIllegalArgumentException() {
1400 <        ThreadPoolExecutor tpe =
1400 >        final ThreadPoolExecutor p =
1401              new ThreadPoolExecutor(2, 3,
1402                                     LONG_DELAY_MS, MILLISECONDS,
1403                                     new ArrayBlockingQueue<Runnable>(10));
1404 <        try {
1405 <            tpe.setKeepAliveTime(-1,MILLISECONDS);
1406 <            shouldThrow();
1407 <        } catch (IllegalArgumentException success) {
1408 <        } finally {
933 <            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1404 >        try (PoolCleaner cleaner = cleaner(p)) {
1405 >            try {
1406 >                p.setKeepAliveTime(-1, MILLISECONDS);
1407 >                shouldThrow();
1408 >            } catch (IllegalArgumentException success) {}
1409          }
935        joinPool(tpe);
1410      }
1411  
1412      /**
1413       * terminated() is called on termination
1414       */
1415      public void testTerminated() {
1416 <        ExtendedTPE tpe = new ExtendedTPE();
1417 <        try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1418 <        assertTrue(tpe.terminatedCalled);
1419 <        joinPool(tpe);
1416 >        ExtendedTPE p = new ExtendedTPE();
1417 >        try (PoolCleaner cleaner = cleaner(p)) {
1418 >            try { p.shutdown(); } catch (SecurityException ok) { return; }
1419 >            assertTrue(p.terminatedCalled());
1420 >            assertTrue(p.isShutdown());
1421 >        }
1422      }
1423  
1424      /**
1425       * beforeExecute and afterExecute are called when executing task
1426       */
1427      public void testBeforeAfter() throws InterruptedException {
1428 <        ExtendedTPE tpe = new ExtendedTPE();
1429 <        try {
1430 <            TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1431 <            tpe.execute(r);
1432 <            Thread.sleep(SHORT_DELAY_MS);
1433 <            assertTrue(r.done);
1434 <            assertTrue(tpe.beforeCalled);
1435 <            assertTrue(tpe.afterCalled);
1436 <            try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1437 <        } finally {
1438 <            joinPool(tpe);
1428 >        ExtendedTPE p = new ExtendedTPE();
1429 >        try (PoolCleaner cleaner = cleaner(p)) {
1430 >            final CountDownLatch done = new CountDownLatch(1);
1431 >            p.execute(new CheckedRunnable() {
1432 >                public void realRun() {
1433 >                    done.countDown();
1434 >                }});
1435 >            await(p.afterCalled);
1436 >            assertEquals(0, done.getCount());
1437 >            assertTrue(p.afterCalled());
1438 >            assertTrue(p.beforeCalled());
1439          }
1440      }
1441  
# Line 967 | Line 1443 | public class ThreadPoolExecutorTest exte
1443       * completed submit of callable returns result
1444       */
1445      public void testSubmitCallable() throws Exception {
1446 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1447 <        try {
1446 >        final ExecutorService e =
1447 >            new ThreadPoolExecutor(2, 2,
1448 >                                   LONG_DELAY_MS, MILLISECONDS,
1449 >                                   new ArrayBlockingQueue<Runnable>(10));
1450 >        try (PoolCleaner cleaner = cleaner(e)) {
1451              Future<String> future = e.submit(new StringTask());
1452              String result = future.get();
1453              assertSame(TEST_STRING, result);
975        } finally {
976            joinPool(e);
1454          }
1455      }
1456  
# Line 981 | Line 1458 | public class ThreadPoolExecutorTest exte
1458       * completed submit of runnable returns successfully
1459       */
1460      public void testSubmitRunnable() throws Exception {
1461 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1462 <        try {
1461 >        final ExecutorService e =
1462 >            new ThreadPoolExecutor(2, 2,
1463 >                                   LONG_DELAY_MS, MILLISECONDS,
1464 >                                   new ArrayBlockingQueue<Runnable>(10));
1465 >        try (PoolCleaner cleaner = cleaner(e)) {
1466              Future<?> future = e.submit(new NoOpRunnable());
1467              future.get();
1468              assertTrue(future.isDone());
989        } finally {
990            joinPool(e);
1469          }
1470      }
1471  
# Line 995 | Line 1473 | public class ThreadPoolExecutorTest exte
1473       * completed submit of (runnable, result) returns result
1474       */
1475      public void testSubmitRunnable2() throws Exception {
1476 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1477 <        try {
1476 >        final ExecutorService e =
1477 >            new ThreadPoolExecutor(2, 2,
1478 >                                   LONG_DELAY_MS, MILLISECONDS,
1479 >                                   new ArrayBlockingQueue<Runnable>(10));
1480 >        try (PoolCleaner cleaner = cleaner(e)) {
1481              Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1482              String result = future.get();
1483              assertSame(TEST_STRING, result);
1003        } finally {
1004            joinPool(e);
1484          }
1485      }
1486  
1008
1487      /**
1488       * invokeAny(null) throws NPE
1489       */
1490      public void testInvokeAny1() throws Exception {
1491 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1492 <        try {
1493 <            e.invokeAny(null);
1494 <            shouldThrow();
1495 <        } catch (NullPointerException success) {
1496 <        } finally {
1497 <            joinPool(e);
1491 >        final ExecutorService e =
1492 >            new ThreadPoolExecutor(2, 2,
1493 >                                   LONG_DELAY_MS, MILLISECONDS,
1494 >                                   new ArrayBlockingQueue<Runnable>(10));
1495 >        try (PoolCleaner cleaner = cleaner(e)) {
1496 >            try {
1497 >                e.invokeAny(null);
1498 >                shouldThrow();
1499 >            } catch (NullPointerException success) {}
1500          }
1501      }
1502  
1503      /**
1504 <     * invokeAny(empty collection) throws IAE
1504 >     * invokeAny(empty collection) throws IllegalArgumentException
1505       */
1506      public void testInvokeAny2() throws Exception {
1507 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1508 <        try {
1509 <            e.invokeAny(new ArrayList<Callable<String>>());
1510 <            shouldThrow();
1511 <        } catch (IllegalArgumentException success) {
1512 <        } finally {
1513 <            joinPool(e);
1507 >        final ExecutorService e =
1508 >            new ThreadPoolExecutor(2, 2,
1509 >                                   LONG_DELAY_MS, MILLISECONDS,
1510 >                                   new ArrayBlockingQueue<Runnable>(10));
1511 >        try (PoolCleaner cleaner = cleaner(e)) {
1512 >            try {
1513 >                e.invokeAny(new ArrayList<Callable<String>>());
1514 >                shouldThrow();
1515 >            } catch (IllegalArgumentException success) {}
1516          }
1517      }
1518  
# Line 1039 | Line 1521 | public class ThreadPoolExecutorTest exte
1521       */
1522      public void testInvokeAny3() throws Exception {
1523          final CountDownLatch latch = new CountDownLatch(1);
1524 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1525 <        try {
1526 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1527 <            l.add(new Callable<String>() {
1528 <                      public String call() {
1529 <                          try {
1530 <                              latch.await();
1049 <                          } catch (InterruptedException ok) {}
1050 <                          return TEST_STRING;
1051 <                      }});
1524 >        final ExecutorService e =
1525 >            new ThreadPoolExecutor(2, 2,
1526 >                                   LONG_DELAY_MS, MILLISECONDS,
1527 >                                   new ArrayBlockingQueue<Runnable>(10));
1528 >        try (PoolCleaner cleaner = cleaner(e)) {
1529 >            List<Callable<String>> l = new ArrayList<>();
1530 >            l.add(latchAwaitingStringTask(latch));
1531              l.add(null);
1532 <            e.invokeAny(l);
1533 <            shouldThrow();
1534 <        } catch (NullPointerException success) {
1535 <        } finally {
1532 >            try {
1533 >                e.invokeAny(l);
1534 >                shouldThrow();
1535 >            } catch (NullPointerException success) {}
1536              latch.countDown();
1058            joinPool(e);
1537          }
1538      }
1539  
# Line 1063 | Line 1541 | public class ThreadPoolExecutorTest exte
1541       * invokeAny(c) throws ExecutionException if no task completes
1542       */
1543      public void testInvokeAny4() throws Exception {
1544 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1545 <        try {
1546 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1544 >        final ExecutorService e =
1545 >            new ThreadPoolExecutor(2, 2,
1546 >                                   LONG_DELAY_MS, MILLISECONDS,
1547 >                                   new ArrayBlockingQueue<Runnable>(10));
1548 >        try (PoolCleaner cleaner = cleaner(e)) {
1549 >            List<Callable<String>> l = new ArrayList<>();
1550              l.add(new NPETask());
1551 <            e.invokeAny(l);
1552 <            shouldThrow();
1553 <        } catch (ExecutionException success) {
1554 <            assertTrue(success.getCause() instanceof NullPointerException);
1555 <        } finally {
1556 <            joinPool(e);
1551 >            try {
1552 >                e.invokeAny(l);
1553 >                shouldThrow();
1554 >            } catch (ExecutionException success) {
1555 >                assertTrue(success.getCause() instanceof NullPointerException);
1556 >            }
1557          }
1558      }
1559  
# Line 1080 | Line 1561 | public class ThreadPoolExecutorTest exte
1561       * invokeAny(c) returns result of some task
1562       */
1563      public void testInvokeAny5() throws Exception {
1564 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1565 <        try {
1566 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1564 >        final ExecutorService e =
1565 >            new ThreadPoolExecutor(2, 2,
1566 >                                   LONG_DELAY_MS, MILLISECONDS,
1567 >                                   new ArrayBlockingQueue<Runnable>(10));
1568 >        try (PoolCleaner cleaner = cleaner(e)) {
1569 >            List<Callable<String>> l = new ArrayList<>();
1570              l.add(new StringTask());
1571              l.add(new StringTask());
1572              String result = e.invokeAny(l);
1573              assertSame(TEST_STRING, result);
1090        } finally {
1091            joinPool(e);
1574          }
1575      }
1576  
# Line 1096 | Line 1578 | public class ThreadPoolExecutorTest exte
1578       * invokeAll(null) throws NPE
1579       */
1580      public void testInvokeAll1() throws Exception {
1581 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1582 <        try {
1583 <            e.invokeAll(null);
1584 <            shouldThrow();
1585 <        } catch (NullPointerException success) {
1586 <        } finally {
1587 <            joinPool(e);
1581 >        final ExecutorService e =
1582 >            new ThreadPoolExecutor(2, 2,
1583 >                                   LONG_DELAY_MS, MILLISECONDS,
1584 >                                   new ArrayBlockingQueue<Runnable>(10));
1585 >        try (PoolCleaner cleaner = cleaner(e)) {
1586 >            try {
1587 >                e.invokeAll(null);
1588 >                shouldThrow();
1589 >            } catch (NullPointerException success) {}
1590          }
1591      }
1592  
1593      /**
1594 <     * invokeAll(empty collection) returns empty collection
1594 >     * invokeAll(empty collection) returns empty list
1595       */
1596      public void testInvokeAll2() throws InterruptedException {
1597 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1598 <        try {
1599 <            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1597 >        final ExecutorService e =
1598 >            new ThreadPoolExecutor(2, 2,
1599 >                                   LONG_DELAY_MS, MILLISECONDS,
1600 >                                   new ArrayBlockingQueue<Runnable>(10));
1601 >        final Collection<Callable<String>> emptyCollection
1602 >            = Collections.emptyList();
1603 >        try (PoolCleaner cleaner = cleaner(e)) {
1604 >            List<Future<String>> r = e.invokeAll(emptyCollection);
1605              assertTrue(r.isEmpty());
1117        } finally {
1118            joinPool(e);
1606          }
1607      }
1608  
# Line 1123 | Line 1610 | public class ThreadPoolExecutorTest exte
1610       * invokeAll(c) throws NPE if c has null elements
1611       */
1612      public void testInvokeAll3() throws Exception {
1613 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1614 <        try {
1615 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1613 >        final ExecutorService e =
1614 >            new ThreadPoolExecutor(2, 2,
1615 >                                   LONG_DELAY_MS, MILLISECONDS,
1616 >                                   new ArrayBlockingQueue<Runnable>(10));
1617 >        try (PoolCleaner cleaner = cleaner(e)) {
1618 >            List<Callable<String>> l = new ArrayList<>();
1619              l.add(new StringTask());
1620              l.add(null);
1621 <            e.invokeAll(l);
1622 <            shouldThrow();
1623 <        } catch (NullPointerException success) {
1624 <        } finally {
1135 <            joinPool(e);
1621 >            try {
1622 >                e.invokeAll(l);
1623 >                shouldThrow();
1624 >            } catch (NullPointerException success) {}
1625          }
1626      }
1627  
# Line 1140 | Line 1629 | public class ThreadPoolExecutorTest exte
1629       * get of element of invokeAll(c) throws exception on failed task
1630       */
1631      public void testInvokeAll4() throws Exception {
1632 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1633 <        try {
1634 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1632 >        final ExecutorService e =
1633 >            new ThreadPoolExecutor(2, 2,
1634 >                                   LONG_DELAY_MS, MILLISECONDS,
1635 >                                   new ArrayBlockingQueue<Runnable>(10));
1636 >        try (PoolCleaner cleaner = cleaner(e)) {
1637 >            List<Callable<String>> l = new ArrayList<>();
1638              l.add(new NPETask());
1639 <            List<Future<String>> result = e.invokeAll(l);
1640 <            assertEquals(1, result.size());
1641 <            for (Future<String> future : result) {
1642 <                try {
1643 <                    future.get();
1644 <                    shouldThrow();
1645 <                } catch (ExecutionException success) {
1154 <                    Throwable cause = success.getCause();
1155 <                    assertTrue(cause instanceof NullPointerException);
1156 <                }
1639 >            List<Future<String>> futures = e.invokeAll(l);
1640 >            assertEquals(1, futures.size());
1641 >            try {
1642 >                futures.get(0).get();
1643 >                shouldThrow();
1644 >            } catch (ExecutionException success) {
1645 >                assertTrue(success.getCause() instanceof NullPointerException);
1646              }
1158        } finally {
1159            joinPool(e);
1647          }
1648      }
1649  
# Line 1164 | Line 1651 | public class ThreadPoolExecutorTest exte
1651       * invokeAll(c) returns results of all completed tasks
1652       */
1653      public void testInvokeAll5() throws Exception {
1654 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1655 <        try {
1656 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1654 >        final ExecutorService e =
1655 >            new ThreadPoolExecutor(2, 2,
1656 >                                   LONG_DELAY_MS, MILLISECONDS,
1657 >                                   new ArrayBlockingQueue<Runnable>(10));
1658 >        try (PoolCleaner cleaner = cleaner(e)) {
1659 >            List<Callable<String>> l = new ArrayList<>();
1660              l.add(new StringTask());
1661              l.add(new StringTask());
1662 <            List<Future<String>> result = e.invokeAll(l);
1663 <            assertEquals(2, result.size());
1664 <            for (Future<String> future : result)
1662 >            List<Future<String>> futures = e.invokeAll(l);
1663 >            assertEquals(2, futures.size());
1664 >            for (Future<String> future : futures)
1665                  assertSame(TEST_STRING, future.get());
1176        } finally {
1177            joinPool(e);
1666          }
1667      }
1668  
1181
1182
1669      /**
1670       * timed invokeAny(null) throws NPE
1671       */
1672      public void testTimedInvokeAny1() throws Exception {
1673 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1674 <        try {
1675 <            e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1676 <            shouldThrow();
1677 <        } catch (NullPointerException success) {
1678 <        } finally {
1679 <            joinPool(e);
1673 >        final ExecutorService e =
1674 >            new ThreadPoolExecutor(2, 2,
1675 >                                   LONG_DELAY_MS, MILLISECONDS,
1676 >                                   new ArrayBlockingQueue<Runnable>(10));
1677 >        try (PoolCleaner cleaner = cleaner(e)) {
1678 >            try {
1679 >                e.invokeAny(null, randomTimeout(), randomTimeUnit());
1680 >                shouldThrow();
1681 >            } catch (NullPointerException success) {}
1682          }
1683      }
1684  
# Line 1198 | Line 1686 | public class ThreadPoolExecutorTest exte
1686       * timed invokeAny(,,null) throws NPE
1687       */
1688      public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1689 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1690 <        try {
1691 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1689 >        final ExecutorService e =
1690 >            new ThreadPoolExecutor(2, 2,
1691 >                                   LONG_DELAY_MS, MILLISECONDS,
1692 >                                   new ArrayBlockingQueue<Runnable>(10));
1693 >        try (PoolCleaner cleaner = cleaner(e)) {
1694 >            List<Callable<String>> l = new ArrayList<>();
1695              l.add(new StringTask());
1696 <            e.invokeAny(l, MEDIUM_DELAY_MS, null);
1697 <            shouldThrow();
1698 <        } catch (NullPointerException success) {
1699 <        } finally {
1209 <            joinPool(e);
1696 >            try {
1697 >                e.invokeAny(l, randomTimeout(), null);
1698 >                shouldThrow();
1699 >            } catch (NullPointerException success) {}
1700          }
1701      }
1702  
1703      /**
1704 <     * timed invokeAny(empty collection) throws IAE
1704 >     * timed invokeAny(empty collection) throws IllegalArgumentException
1705       */
1706      public void testTimedInvokeAny2() throws Exception {
1707 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1708 <        try {
1709 <            e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1710 <            shouldThrow();
1711 <        } catch (IllegalArgumentException success) {
1712 <        } finally {
1713 <            joinPool(e);
1707 >        final ExecutorService e =
1708 >            new ThreadPoolExecutor(2, 2,
1709 >                                   LONG_DELAY_MS, MILLISECONDS,
1710 >                                   new ArrayBlockingQueue<Runnable>(10));
1711 >        try (PoolCleaner cleaner = cleaner(e)) {
1712 >            try {
1713 >                e.invokeAny(new ArrayList<Callable<String>>(),
1714 >                            randomTimeout(), randomTimeUnit());
1715 >                shouldThrow();
1716 >            } catch (IllegalArgumentException success) {}
1717          }
1718      }
1719  
1720      /**
1721 <     * timed invokeAny(c) throws NPE if c has null elements
1721 >     * timed invokeAny(c) throws NullPointerException if c has null elements
1722       */
1723      public void testTimedInvokeAny3() throws Exception {
1724          final CountDownLatch latch = new CountDownLatch(1);
1725 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1726 <        try {
1727 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1728 <            l.add(new Callable<String>() {
1729 <                      public String call() {
1730 <                          try {
1731 <                              latch.await();
1239 <                          } catch (InterruptedException ok) {}
1240 <                          return TEST_STRING;
1241 <                      }});
1725 >        final ExecutorService e =
1726 >            new ThreadPoolExecutor(2, 2,
1727 >                                   LONG_DELAY_MS, MILLISECONDS,
1728 >                                   new ArrayBlockingQueue<Runnable>(10));
1729 >        try (PoolCleaner cleaner = cleaner(e)) {
1730 >            List<Callable<String>> l = new ArrayList<>();
1731 >            l.add(latchAwaitingStringTask(latch));
1732              l.add(null);
1733 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1734 <            shouldThrow();
1735 <        } catch (NullPointerException success) {
1736 <        } finally {
1733 >            try {
1734 >                e.invokeAny(l, randomTimeout(), randomTimeUnit());
1735 >                shouldThrow();
1736 >            } catch (NullPointerException success) {}
1737              latch.countDown();
1248            joinPool(e);
1738          }
1739      }
1740  
# Line 1253 | Line 1742 | public class ThreadPoolExecutorTest exte
1742       * timed invokeAny(c) throws ExecutionException if no task completes
1743       */
1744      public void testTimedInvokeAny4() throws Exception {
1745 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1746 <        try {
1747 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1745 >        final ExecutorService e =
1746 >            new ThreadPoolExecutor(2, 2,
1747 >                                   LONG_DELAY_MS, MILLISECONDS,
1748 >                                   new ArrayBlockingQueue<Runnable>(10));
1749 >        try (PoolCleaner cleaner = cleaner(e)) {
1750 >            long startTime = System.nanoTime();
1751 >            List<Callable<String>> l = new ArrayList<>();
1752              l.add(new NPETask());
1753 <            e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1754 <            shouldThrow();
1755 <        } catch (ExecutionException success) {
1756 <            assertTrue(success.getCause() instanceof NullPointerException);
1757 <        } finally {
1758 <            joinPool(e);
1753 >            try {
1754 >                e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
1755 >                shouldThrow();
1756 >            } catch (ExecutionException success) {
1757 >                assertTrue(success.getCause() instanceof NullPointerException);
1758 >            }
1759 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1760          }
1761      }
1762  
# Line 1270 | Line 1764 | public class ThreadPoolExecutorTest exte
1764       * timed invokeAny(c) returns result of some task
1765       */
1766      public void testTimedInvokeAny5() throws Exception {
1767 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1768 <        try {
1769 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1767 >        final ExecutorService e =
1768 >            new ThreadPoolExecutor(2, 2,
1769 >                                   LONG_DELAY_MS, MILLISECONDS,
1770 >                                   new ArrayBlockingQueue<Runnable>(10));
1771 >        try (PoolCleaner cleaner = cleaner(e)) {
1772 >            long startTime = System.nanoTime();
1773 >            List<Callable<String>> l = new ArrayList<>();
1774              l.add(new StringTask());
1775              l.add(new StringTask());
1776 <            String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1776 >            String result = e.invokeAny(l, LONG_DELAY_MS, MILLISECONDS);
1777              assertSame(TEST_STRING, result);
1778 <        } finally {
1281 <            joinPool(e);
1778 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1779          }
1780      }
1781  
# Line 1286 | Line 1783 | public class ThreadPoolExecutorTest exte
1783       * timed invokeAll(null) throws NPE
1784       */
1785      public void testTimedInvokeAll1() throws Exception {
1786 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1787 <        try {
1788 <            e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1789 <            shouldThrow();
1790 <        } catch (NullPointerException success) {
1791 <        } finally {
1792 <            joinPool(e);
1786 >        final ExecutorService e =
1787 >            new ThreadPoolExecutor(2, 2,
1788 >                                   LONG_DELAY_MS, MILLISECONDS,
1789 >                                   new ArrayBlockingQueue<Runnable>(10));
1790 >        try (PoolCleaner cleaner = cleaner(e)) {
1791 >            try {
1792 >                e.invokeAll(null, randomTimeout(), randomTimeUnit());
1793 >                shouldThrow();
1794 >            } catch (NullPointerException success) {}
1795          }
1796      }
1797  
# Line 1300 | Line 1799 | public class ThreadPoolExecutorTest exte
1799       * timed invokeAll(,,null) throws NPE
1800       */
1801      public void testTimedInvokeAllNullTimeUnit() throws Exception {
1802 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1803 <        try {
1804 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1802 >        final ExecutorService e =
1803 >            new ThreadPoolExecutor(2, 2,
1804 >                                   LONG_DELAY_MS, MILLISECONDS,
1805 >                                   new ArrayBlockingQueue<Runnable>(10));
1806 >        try (PoolCleaner cleaner = cleaner(e)) {
1807 >            List<Callable<String>> l = new ArrayList<>();
1808              l.add(new StringTask());
1809 <            e.invokeAll(l, MEDIUM_DELAY_MS, null);
1810 <            shouldThrow();
1811 <        } catch (NullPointerException success) {
1812 <        } finally {
1311 <            joinPool(e);
1809 >            try {
1810 >                e.invokeAll(l, randomTimeout(), null);
1811 >                shouldThrow();
1812 >            } catch (NullPointerException success) {}
1813          }
1814      }
1815  
1816      /**
1817 <     * timed invokeAll(empty collection) returns empty collection
1817 >     * timed invokeAll(empty collection) returns empty list
1818       */
1819      public void testTimedInvokeAll2() throws InterruptedException {
1820 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1821 <        try {
1822 <            List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, MILLISECONDS);
1820 >        final ExecutorService e =
1821 >            new ThreadPoolExecutor(2, 2,
1822 >                                   LONG_DELAY_MS, MILLISECONDS,
1823 >                                   new ArrayBlockingQueue<Runnable>(10));
1824 >        final Collection<Callable<String>> emptyCollection
1825 >            = Collections.emptyList();
1826 >        try (PoolCleaner cleaner = cleaner(e)) {
1827 >            List<Future<String>> r =
1828 >                e.invokeAll(emptyCollection, randomTimeout(), randomTimeUnit());
1829              assertTrue(r.isEmpty());
1323        } finally {
1324            joinPool(e);
1830          }
1831      }
1832  
# Line 1329 | Line 1834 | public class ThreadPoolExecutorTest exte
1834       * timed invokeAll(c) throws NPE if c has null elements
1835       */
1836      public void testTimedInvokeAll3() throws Exception {
1837 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1838 <        try {
1839 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1837 >        final ExecutorService e =
1838 >            new ThreadPoolExecutor(2, 2,
1839 >                                   LONG_DELAY_MS, MILLISECONDS,
1840 >                                   new ArrayBlockingQueue<Runnable>(10));
1841 >        try (PoolCleaner cleaner = cleaner(e)) {
1842 >            List<Callable<String>> l = new ArrayList<>();
1843              l.add(new StringTask());
1844              l.add(null);
1845 <            e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1846 <            shouldThrow();
1847 <        } catch (NullPointerException success) {
1848 <        } finally {
1341 <            joinPool(e);
1845 >            try {
1846 >                e.invokeAll(l, randomTimeout(), randomTimeUnit());
1847 >                shouldThrow();
1848 >            } catch (NullPointerException success) {}
1849          }
1850      }
1851  
# Line 1346 | Line 1853 | public class ThreadPoolExecutorTest exte
1853       * get of element of invokeAll(c) throws exception on failed task
1854       */
1855      public void testTimedInvokeAll4() throws Exception {
1856 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1857 <        try {
1858 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1856 >        final ExecutorService e =
1857 >            new ThreadPoolExecutor(2, 2,
1858 >                                   LONG_DELAY_MS, MILLISECONDS,
1859 >                                   new ArrayBlockingQueue<Runnable>(10));
1860 >        try (PoolCleaner cleaner = cleaner(e)) {
1861 >            List<Callable<String>> l = new ArrayList<>();
1862              l.add(new NPETask());
1863 <            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1864 <            assertEquals(1, result.size());
1865 <            for (Future<String> future : result)
1866 <                future.get();
1867 <            shouldThrow();
1868 <        } catch (ExecutionException success) {
1869 <            assertTrue(success.getCause() instanceof NullPointerException);
1870 <        } finally {
1871 <            joinPool(e);
1863 >            List<Future<String>> futures =
1864 >                e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1865 >            assertEquals(1, futures.size());
1866 >            try {
1867 >                futures.get(0).get();
1868 >                shouldThrow();
1869 >            } catch (ExecutionException success) {
1870 >                assertTrue(success.getCause() instanceof NullPointerException);
1871 >            }
1872          }
1873      }
1874  
# Line 1366 | Line 1876 | public class ThreadPoolExecutorTest exte
1876       * timed invokeAll(c) returns results of all completed tasks
1877       */
1878      public void testTimedInvokeAll5() throws Exception {
1879 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1880 <        try {
1881 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1879 >        final ExecutorService e =
1880 >            new ThreadPoolExecutor(2, 2,
1881 >                                   LONG_DELAY_MS, MILLISECONDS,
1882 >                                   new ArrayBlockingQueue<Runnable>(10));
1883 >        try (PoolCleaner cleaner = cleaner(e)) {
1884 >            List<Callable<String>> l = new ArrayList<>();
1885              l.add(new StringTask());
1886              l.add(new StringTask());
1887 <            List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1888 <            assertEquals(2, result.size());
1889 <            for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1890 <                assertSame(TEST_STRING, it.next().get());
1891 <        } finally {
1379 <            joinPool(e);
1887 >            List<Future<String>> futures =
1888 >                e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1889 >            assertEquals(2, futures.size());
1890 >            for (Future<String> future : futures)
1891 >                assertSame(TEST_STRING, future.get());
1892          }
1893      }
1894  
# Line 1384 | Line 1896 | public class ThreadPoolExecutorTest exte
1896       * timed invokeAll(c) cancels tasks not completed by timeout
1897       */
1898      public void testTimedInvokeAll6() throws Exception {
1899 <        ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1900 <        try {
1901 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1902 <            l.add(new StringTask());
1903 <            l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1904 <            l.add(new StringTask());
1905 <            List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, MILLISECONDS);
1906 <            assertEquals(3, result.size());
1907 <            Iterator<Future<String>> it = result.iterator();
1908 <            Future<String> f1 = it.next();
1909 <            Future<String> f2 = it.next();
1910 <            Future<String> f3 = it.next();
1911 <            assertTrue(f1.isDone());
1912 <            assertTrue(f2.isDone());
1913 <            assertTrue(f3.isDone());
1914 <            assertFalse(f1.isCancelled());
1915 <            assertTrue(f2.isCancelled());
1916 <        } finally {
1917 <            joinPool(e);
1899 >        for (long timeout = timeoutMillis();;) {
1900 >            final CountDownLatch done = new CountDownLatch(1);
1901 >            final Callable<String> waiter = new CheckedCallable<String>() {
1902 >                public String realCall() {
1903 >                    try { done.await(LONG_DELAY_MS, MILLISECONDS); }
1904 >                    catch (InterruptedException ok) {}
1905 >                    return "1"; }};
1906 >            final ExecutorService p =
1907 >                new ThreadPoolExecutor(2, 2,
1908 >                                       LONG_DELAY_MS, MILLISECONDS,
1909 >                                       new ArrayBlockingQueue<Runnable>(10));
1910 >            try (PoolCleaner cleaner = cleaner(p, done)) {
1911 >                List<Callable<String>> tasks = new ArrayList<>();
1912 >                tasks.add(new StringTask("0"));
1913 >                tasks.add(waiter);
1914 >                tasks.add(new StringTask("2"));
1915 >                long startTime = System.nanoTime();
1916 >                List<Future<String>> futures =
1917 >                    p.invokeAll(tasks, timeout, MILLISECONDS);
1918 >                assertEquals(tasks.size(), futures.size());
1919 >                assertTrue(millisElapsedSince(startTime) >= timeout);
1920 >                for (Future future : futures)
1921 >                    assertTrue(future.isDone());
1922 >                assertTrue(futures.get(1).isCancelled());
1923 >                try {
1924 >                    assertEquals("0", futures.get(0).get());
1925 >                    assertEquals("2", futures.get(2).get());
1926 >                    break;
1927 >                } catch (CancellationException retryWithLongerTimeout) {
1928 >                    timeout *= 2;
1929 >                    if (timeout >= LONG_DELAY_MS / 2)
1930 >                        fail("expected exactly one task to be cancelled");
1931 >                }
1932 >            }
1933          }
1934      }
1935  
# Line 1411 | Line 1938 | public class ThreadPoolExecutorTest exte
1938       * thread factory fails to create more
1939       */
1940      public void testFailingThreadFactory() throws InterruptedException {
1941 <        ExecutorService e = new ThreadPoolExecutor(100, 100, LONG_DELAY_MS, MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1942 <        try {
1943 <            ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1944 <            for (int k = 0; k < 100; ++k) {
1945 <                e.execute(new NoOpRunnable());
1946 <            }
1947 <            Thread.sleep(LONG_DELAY_MS);
1948 <        } finally {
1949 <            joinPool(e);
1941 >        final ExecutorService e =
1942 >            new ThreadPoolExecutor(100, 100,
1943 >                                   LONG_DELAY_MS, MILLISECONDS,
1944 >                                   new LinkedBlockingQueue<Runnable>(),
1945 >                                   new FailingThreadFactory());
1946 >        try (PoolCleaner cleaner = cleaner(e)) {
1947 >            final int TASKS = 100;
1948 >            final CountDownLatch done = new CountDownLatch(TASKS);
1949 >            for (int k = 0; k < TASKS; ++k)
1950 >                e.execute(new CheckedRunnable() {
1951 >                    public void realRun() {
1952 >                        done.countDown();
1953 >                    }});
1954 >            await(done);
1955          }
1956      }
1957  
# Line 1427 | Line 1959 | public class ThreadPoolExecutorTest exte
1959       * allowsCoreThreadTimeOut is by default false.
1960       */
1961      public void testAllowsCoreThreadTimeOut() {
1962 <        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 2, 1000, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1963 <        assertFalse(tpe.allowsCoreThreadTimeOut());
1964 <        joinPool(tpe);
1962 >        final ThreadPoolExecutor p =
1963 >            new ThreadPoolExecutor(2, 2,
1964 >                                   1000, MILLISECONDS,
1965 >                                   new ArrayBlockingQueue<Runnable>(10));
1966 >        try (PoolCleaner cleaner = cleaner(p)) {
1967 >            assertFalse(p.allowsCoreThreadTimeOut());
1968 >        }
1969      }
1970  
1971      /**
1972       * allowCoreThreadTimeOut(true) causes idle threads to time out
1973       */
1974 <    public void testAllowCoreThreadTimeOut_true() throws InterruptedException {
1975 <        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1976 <        tpe.allowCoreThreadTimeOut(true);
1977 <        tpe.execute(new NoOpRunnable());
1978 <        try {
1979 <            Thread.sleep(MEDIUM_DELAY_MS);
1980 <            assertEquals(0, tpe.getPoolSize());
1981 <        } finally {
1982 <            joinPool(tpe);
1974 >    public void testAllowCoreThreadTimeOut_true() throws Exception {
1975 >        long keepAliveTime = timeoutMillis();
1976 >        final ThreadPoolExecutor p =
1977 >            new ThreadPoolExecutor(2, 10,
1978 >                                   keepAliveTime, MILLISECONDS,
1979 >                                   new ArrayBlockingQueue<Runnable>(10));
1980 >        try (PoolCleaner cleaner = cleaner(p)) {
1981 >            final CountDownLatch threadStarted = new CountDownLatch(1);
1982 >            p.allowCoreThreadTimeOut(true);
1983 >            p.execute(new CheckedRunnable() {
1984 >                public void realRun() {
1985 >                    threadStarted.countDown();
1986 >                    assertEquals(1, p.getPoolSize());
1987 >                }});
1988 >            await(threadStarted);
1989 >            delay(keepAliveTime);
1990 >            long startTime = System.nanoTime();
1991 >            while (p.getPoolSize() > 0
1992 >                   && millisElapsedSince(startTime) < LONG_DELAY_MS)
1993 >                Thread.yield();
1994 >            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1995 >            assertEquals(0, p.getPoolSize());
1996          }
1997      }
1998  
1999      /**
2000       * allowCoreThreadTimeOut(false) causes idle threads not to time out
2001       */
2002 <    public void testAllowCoreThreadTimeOut_false() throws InterruptedException {
2003 <        ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
2004 <        tpe.allowCoreThreadTimeOut(false);
2005 <        tpe.execute(new NoOpRunnable());
2006 <        try {
2007 <            Thread.sleep(MEDIUM_DELAY_MS);
2008 <            assertTrue(tpe.getPoolSize() >= 1);
2009 <        } finally {
2010 <            joinPool(tpe);
2002 >    public void testAllowCoreThreadTimeOut_false() throws Exception {
2003 >        long keepAliveTime = timeoutMillis();
2004 >        final ThreadPoolExecutor p =
2005 >            new ThreadPoolExecutor(2, 10,
2006 >                                   keepAliveTime, MILLISECONDS,
2007 >                                   new ArrayBlockingQueue<Runnable>(10));
2008 >        try (PoolCleaner cleaner = cleaner(p)) {
2009 >            final CountDownLatch threadStarted = new CountDownLatch(1);
2010 >            p.allowCoreThreadTimeOut(false);
2011 >            p.execute(new CheckedRunnable() {
2012 >                public void realRun() throws InterruptedException {
2013 >                    threadStarted.countDown();
2014 >                    assertTrue(p.getPoolSize() >= 1);
2015 >                }});
2016 >            delay(2 * keepAliveTime);
2017 >            assertTrue(p.getPoolSize() >= 1);
2018          }
2019      }
2020  
# Line 1468 | Line 2024 | public class ThreadPoolExecutorTest exte
2024       */
2025      public void testRejectedRecycledTask() throws InterruptedException {
2026          final int nTasks = 1000;
2027 <        final AtomicInteger nRun = new AtomicInteger(0);
2027 >        final CountDownLatch done = new CountDownLatch(nTasks);
2028          final Runnable recycledTask = new Runnable() {
2029 <                public void run() {
2030 <                    nRun.getAndIncrement();
2031 <                } };
2029 >            public void run() {
2030 >                done.countDown();
2031 >            }};
2032          final ThreadPoolExecutor p =
2033 <            new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
2033 >            new ThreadPoolExecutor(1, 30,
2034 >                                   60, SECONDS,
2035                                     new ArrayBlockingQueue(30));
2036 <        try {
2036 >        try (PoolCleaner cleaner = cleaner(p)) {
2037              for (int i = 0; i < nTasks; ++i) {
2038                  for (;;) {
2039                      try {
2040                          p.execute(recycledTask);
2041                          break;
2042                      }
2043 <                    catch (RejectedExecutionException ignore) {
1487 <                    }
2043 >                    catch (RejectedExecutionException ignore) {}
2044                  }
2045              }
2046 <            Thread.sleep(5000); // enough time to run all tasks
2047 <            assertEquals(nRun.get(), nTasks);
2048 <        } finally {
2049 <            p.shutdown();
2046 >            // enough time to run all tasks
2047 >            await(done, nTasks * SHORT_DELAY_MS);
2048 >        }
2049 >    }
2050 >
2051 >    /**
2052 >     * get(cancelled task) throws CancellationException
2053 >     */
2054 >    public void testGet_cancelled() throws Exception {
2055 >        final CountDownLatch done = new CountDownLatch(1);
2056 >        final ExecutorService e =
2057 >            new ThreadPoolExecutor(1, 1,
2058 >                                   LONG_DELAY_MS, MILLISECONDS,
2059 >                                   new LinkedBlockingQueue<Runnable>());
2060 >        try (PoolCleaner cleaner = cleaner(e, done)) {
2061 >            final CountDownLatch blockerStarted = new CountDownLatch(1);
2062 >            final List<Future<?>> futures = new ArrayList<>();
2063 >            for (int i = 0; i < 2; i++) {
2064 >                Runnable r = new CheckedRunnable() { public void realRun()
2065 >                                                         throws Throwable {
2066 >                    blockerStarted.countDown();
2067 >                    assertTrue(done.await(2 * LONG_DELAY_MS, MILLISECONDS));
2068 >                }};
2069 >                futures.add(e.submit(r));
2070 >            }
2071 >            await(blockerStarted);
2072 >            for (Future<?> future : futures) future.cancel(false);
2073 >            for (Future<?> future : futures) {
2074 >                try {
2075 >                    future.get();
2076 >                    shouldThrow();
2077 >                } catch (CancellationException success) {}
2078 >                try {
2079 >                    future.get(LONG_DELAY_MS, MILLISECONDS);
2080 >                    shouldThrow();
2081 >                } catch (CancellationException success) {}
2082 >                assertTrue(future.isCancelled());
2083 >                assertTrue(future.isDone());
2084 >            }
2085          }
2086      }
2087  
2088 +    /** Directly test simple ThreadPoolExecutor RejectedExecutionHandlers. */
2089 +    public void testStandardRejectedExecutionHandlers() {
2090 +        final ThreadPoolExecutor p =
2091 +            new ThreadPoolExecutor(1, 1, 1, SECONDS,
2092 +                                   new ArrayBlockingQueue<Runnable>(1));
2093 +        final AtomicReference<Thread> thread = new AtomicReference<>();
2094 +        final Runnable r = new Runnable() { public void run() {
2095 +            thread.set(Thread.currentThread()); }};
2096 +
2097 +        try {
2098 +            new AbortPolicy().rejectedExecution(r, p);
2099 +            shouldThrow();
2100 +        } catch (RejectedExecutionException success) {}
2101 +        assertNull(thread.get());
2102 +
2103 +        new DiscardPolicy().rejectedExecution(r, p);
2104 +        assertNull(thread.get());
2105 +
2106 +        new CallerRunsPolicy().rejectedExecution(r, p);
2107 +        assertSame(Thread.currentThread(), thread.get());
2108 +
2109 +        // check that pool was not perturbed by handlers
2110 +        assertTrue(p.getRejectedExecutionHandler() instanceof AbortPolicy);
2111 +        assertEquals(0, p.getTaskCount());
2112 +        assertTrue(p.getQueue().isEmpty());
2113 +    }
2114 +
2115   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines