ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.123
Committed: Sat Jul 15 23:15:21 2017 UTC (6 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.122: +113 -89 lines
Log Message:
improve tests of saturated pools

File Contents

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