ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.121
Committed: Sat Jul 15 18:28:08 2017 UTC (6 years, 10 months ago) by jsr166
Branch: MAIN
Changes since 1.120: +29 -10 lines
Log Message:
add testCallerRunsPolicy

File Contents

# Content
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/publicdomain/zero/1.0/
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import static java.util.concurrent.TimeUnit.MILLISECONDS;
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 main(suite(), args);
45 }
46 public static Test suite() {
47 return new TestSuite(ThreadPoolExecutorTest.class);
48 }
49
50 static class ExtendedTPE extends ThreadPoolExecutor {
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.countDown();
60 }
61 protected void afterExecute(Runnable r, Throwable t) {
62 afterCalled.countDown();
63 }
64 protected void terminated() {
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
79 static class FailingThreadFactory implements ThreadFactory {
80 int calls = 0;
81 public Thread newThread(Runnable r) {
82 if (++calls > 1) return null;
83 return new Thread(r);
84 }
85 }
86
87 /**
88 * execute successfully executes a runnable
89 */
90 public void testExecute() throws InterruptedException {
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
107 */
108 public void testGetActiveCount() throws InterruptedException {
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
130 */
131 public void testPrestartCoreThread() {
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
156 */
157 public void testPrestartAllCoreThreads() {
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
179 */
180 public void testGetCompletedTaskCount() throws InterruptedException {
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
212 */
213 public void testGetCorePoolSize() {
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
225 */
226 public void testGetKeepAliveTime() {
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
236 /**
237 * getThreadFactory returns factory in constructor if not set
238 */
239 public void testGetThreadFactory() {
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 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
267 /**
268 * setThreadFactory(null) throws NPE
269 */
270 public void testSetThreadFactoryNull() {
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
296 /**
297 * getRejectedExecutionHandler returns handler in constructor if not set
298 */
299 public void testGetRejectedExecutionHandler() {
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 /**
312 * setRejectedExecutionHandler sets the handler returned by
313 * getRejectedExecutionHandler
314 */
315 public void testSetRejectedExecutionHandler() {
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
327 /**
328 * setRejectedExecutionHandler(null) throws NPE
329 */
330 public void testSetRejectedExecutionHandlerNull() {
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
343 /**
344 * getLargestPoolSize increases, but doesn't overestimate, when
345 * multiple threads active
346 */
347 public void testGetLargestPoolSize() throws InterruptedException {
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
373 */
374 public void testGetMaximumPoolSize() {
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
391 */
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
414 */
415 public void testGetTaskCount() throws InterruptedException {
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
452 */
453 public void testIsShutdown() {
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
499 */
500 public void testIsTerminated() throws InterruptedException {
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 }
523 }
524
525 /**
526 * isTerminating is not true when running or when terminated
527 */
528 public void testIsTerminating() throws InterruptedException {
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 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
585 /**
586 * remove(task) removes queued task, and fails to remove active task
587 */
588 public void testRemove() throws InterruptedException {
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(p.remove(tasks[4]));
611 assertFalse(p.remove(tasks[4]));
612 assertFalse(q.contains(tasks[4]));
613 assertTrue(q.contains(tasks[3]));
614 assertTrue(p.remove(tasks[3]));
615 assertFalse(q.contains(tasks[3]));
616 }
617 }
618
619 /**
620 * purge removes cancelled tasks from the queue
621 */
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 }
656 }
657
658 /**
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 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
700 /**
701 * Constructor throws if corePoolSize argument is less than zero
702 */
703 public void testConstructor1() {
704 try {
705 new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
706 new ArrayBlockingQueue<Runnable>(10));
707 shouldThrow();
708 } catch (IllegalArgumentException success) {}
709 }
710
711 /**
712 * Constructor throws if maximumPoolSize is less than zero
713 */
714 public void testConstructor2() {
715 try {
716 new ThreadPoolExecutor(1, -1, 1L, SECONDS,
717 new ArrayBlockingQueue<Runnable>(10));
718 shouldThrow();
719 } catch (IllegalArgumentException success) {}
720 }
721
722 /**
723 * Constructor throws if maximumPoolSize is equal to zero
724 */
725 public void testConstructor3() {
726 try {
727 new ThreadPoolExecutor(1, 0, 1L, SECONDS,
728 new ArrayBlockingQueue<Runnable>(10));
729 shouldThrow();
730 } catch (IllegalArgumentException success) {}
731 }
732
733 /**
734 * Constructor throws if keepAliveTime is less than zero
735 */
736 public void testConstructor4() {
737 try {
738 new ThreadPoolExecutor(1, 2, -1L, SECONDS,
739 new ArrayBlockingQueue<Runnable>(10));
740 shouldThrow();
741 } catch (IllegalArgumentException success) {}
742 }
743
744 /**
745 * Constructor throws if corePoolSize is greater than the maximumPoolSize
746 */
747 public void testConstructor5() {
748 try {
749 new ThreadPoolExecutor(2, 1, 1L, SECONDS,
750 new ArrayBlockingQueue<Runnable>(10));
751 shouldThrow();
752 } catch (IllegalArgumentException success) {}
753 }
754
755 /**
756 * Constructor throws if workQueue is set to null
757 */
758 public void testConstructorNullPointerException() {
759 try {
760 new ThreadPoolExecutor(1, 2, 1L, SECONDS,
761 (BlockingQueue) null);
762 shouldThrow();
763 } catch (NullPointerException success) {}
764 }
765
766 /**
767 * Constructor throws if corePoolSize argument is less than zero
768 */
769 public void testConstructor6() {
770 try {
771 new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
772 new ArrayBlockingQueue<Runnable>(10),
773 new SimpleThreadFactory());
774 shouldThrow();
775 } catch (IllegalArgumentException success) {}
776 }
777
778 /**
779 * Constructor throws if maximumPoolSize is less than zero
780 */
781 public void testConstructor7() {
782 try {
783 new ThreadPoolExecutor(1, -1, 1L, SECONDS,
784 new ArrayBlockingQueue<Runnable>(10),
785 new SimpleThreadFactory());
786 shouldThrow();
787 } catch (IllegalArgumentException success) {}
788 }
789
790 /**
791 * Constructor throws if maximumPoolSize is equal to zero
792 */
793 public void testConstructor8() {
794 try {
795 new ThreadPoolExecutor(1, 0, 1L, SECONDS,
796 new ArrayBlockingQueue<Runnable>(10),
797 new SimpleThreadFactory());
798 shouldThrow();
799 } catch (IllegalArgumentException success) {}
800 }
801
802 /**
803 * Constructor throws if keepAliveTime is less than zero
804 */
805 public void testConstructor9() {
806 try {
807 new ThreadPoolExecutor(1, 2, -1L, SECONDS,
808 new ArrayBlockingQueue<Runnable>(10),
809 new SimpleThreadFactory());
810 shouldThrow();
811 } catch (IllegalArgumentException success) {}
812 }
813
814 /**
815 * Constructor throws if corePoolSize is greater than the maximumPoolSize
816 */
817 public void testConstructor10() {
818 try {
819 new ThreadPoolExecutor(2, 1, 1L, SECONDS,
820 new ArrayBlockingQueue<Runnable>(10),
821 new SimpleThreadFactory());
822 shouldThrow();
823 } catch (IllegalArgumentException success) {}
824 }
825
826 /**
827 * Constructor throws if workQueue is set to null
828 */
829 public void testConstructorNullPointerException2() {
830 try {
831 new ThreadPoolExecutor(1, 2, 1L, SECONDS,
832 (BlockingQueue) null,
833 new SimpleThreadFactory());
834 shouldThrow();
835 } catch (NullPointerException success) {}
836 }
837
838 /**
839 * Constructor throws if threadFactory is set to null
840 */
841 public void testConstructorNullPointerException3() {
842 try {
843 new ThreadPoolExecutor(1, 2, 1L, SECONDS,
844 new ArrayBlockingQueue<Runnable>(10),
845 (ThreadFactory) null);
846 shouldThrow();
847 } catch (NullPointerException success) {}
848 }
849
850 /**
851 * Constructor throws if corePoolSize argument is less than zero
852 */
853 public void testConstructor11() {
854 try {
855 new ThreadPoolExecutor(-1, 1, 1L, SECONDS,
856 new ArrayBlockingQueue<Runnable>(10),
857 new NoOpREHandler());
858 shouldThrow();
859 } catch (IllegalArgumentException success) {}
860 }
861
862 /**
863 * Constructor throws if maximumPoolSize is less than zero
864 */
865 public void testConstructor12() {
866 try {
867 new ThreadPoolExecutor(1, -1, 1L, SECONDS,
868 new ArrayBlockingQueue<Runnable>(10),
869 new NoOpREHandler());
870 shouldThrow();
871 } catch (IllegalArgumentException success) {}
872 }
873
874 /**
875 * Constructor throws if maximumPoolSize is equal to zero
876 */
877 public void testConstructor13() {
878 try {
879 new ThreadPoolExecutor(1, 0, 1L, SECONDS,
880 new ArrayBlockingQueue<Runnable>(10),
881 new NoOpREHandler());
882 shouldThrow();
883 } catch (IllegalArgumentException success) {}
884 }
885
886 /**
887 * Constructor throws if keepAliveTime is less than zero
888 */
889 public void testConstructor14() {
890 try {
891 new ThreadPoolExecutor(1, 2, -1L, SECONDS,
892 new ArrayBlockingQueue<Runnable>(10),
893 new NoOpREHandler());
894 shouldThrow();
895 } catch (IllegalArgumentException success) {}
896 }
897
898 /**
899 * Constructor throws if corePoolSize is greater than the maximumPoolSize
900 */
901 public void testConstructor15() {
902 try {
903 new ThreadPoolExecutor(2, 1, 1L, SECONDS,
904 new ArrayBlockingQueue<Runnable>(10),
905 new NoOpREHandler());
906 shouldThrow();
907 } catch (IllegalArgumentException success) {}
908 }
909
910 /**
911 * Constructor throws if workQueue is set to null
912 */
913 public void testConstructorNullPointerException4() {
914 try {
915 new ThreadPoolExecutor(1, 2, 1L, SECONDS,
916 (BlockingQueue) null,
917 new NoOpREHandler());
918 shouldThrow();
919 } catch (NullPointerException success) {}
920 }
921
922 /**
923 * Constructor throws if handler is set to null
924 */
925 public void testConstructorNullPointerException5() {
926 try {
927 new ThreadPoolExecutor(1, 2, 1L, SECONDS,
928 new ArrayBlockingQueue<Runnable>(10),
929 (RejectedExecutionHandler) null);
930 shouldThrow();
931 } catch (NullPointerException success) {}
932 }
933
934 /**
935 * Constructor throws if corePoolSize argument is less than zero
936 */
937 public void testConstructor16() {
938 try {
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 }
946
947 /**
948 * Constructor throws if maximumPoolSize is less than zero
949 */
950 public void testConstructor17() {
951 try {
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 }
959
960 /**
961 * Constructor throws if maximumPoolSize is equal to zero
962 */
963 public void testConstructor18() {
964 try {
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 }
972
973 /**
974 * Constructor throws if keepAliveTime is less than zero
975 */
976 public void testConstructor19() {
977 try {
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 }
985
986 /**
987 * Constructor throws if corePoolSize is greater than the maximumPoolSize
988 */
989 public void testConstructor20() {
990 try {
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 null
1001 */
1002 public void testConstructorNullPointerException6() {
1003 try {
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 null
1014 */
1015 public void testConstructorNullPointerException7() {
1016 try {
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 null
1027 */
1028 public void testConstructorNullPointerException8() {
1029 try {
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 if saturated.
1069 */
1070 public void testSaturatedExecute() {
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 (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(task);
1083 for (int i = 0; i < 2; ++i) {
1084 try {
1085 p.execute(task);
1086 shouldThrow();
1087 } catch (RejectedExecutionException success) {}
1088 assertTrue(p.getTaskCount() <= 2);
1089 }
1090 }
1091 }
1092
1093 /**
1094 * submit(runnable) throws RejectedExecutionException if saturated.
1095 */
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 < tasks.length; i++)
1164 tasks[i] = new TrackedNoOpRunnable();
1165 for (int i = 0; i < tasks.length; i++)
1166 p.execute(tasks[i]);
1167 for (int i = 1; i < tasks.length; i++)
1168 assertTrue(tasks[i].done);
1169 assertFalse(tasks[0].done); // waiting in queue
1170 done.countDown();
1171 }
1172 }
1173
1174 /**
1175 * executor using DiscardPolicy drops task if saturated.
1176 */
1177 public void testSaturatedExecute3() {
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);
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.
1202 */
1203 public void testSaturatedExecute4() {
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));
1220 p.execute(r3);
1221 assertFalse(p.getQueue().contains(r2));
1222 assertTrue(p.getQueue().contains(r3));
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
1231 */
1232 public void testRejectedExecutionExceptionOnShutdown() {
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
1248 */
1249 public void testCallerRunsOnShutdown() {
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 (PoolCleaner cleaner = cleaner(p)) {
1258 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1259 p.execute(r);
1260 assertFalse(r.done);
1261 }
1262 }
1263
1264 /**
1265 * execute using DiscardPolicy drops task on shutdown
1266 */
1267 public void testDiscardOnShutdown() {
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 (PoolCleaner cleaner = cleaner(p)) {
1276 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1277 p.execute(r);
1278 assertFalse(r.done);
1279 }
1280 }
1281
1282 /**
1283 * execute using DiscardOldestPolicy drops task on shutdown
1284 */
1285 public void testDiscardOldestOnShutdown() {
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 (PoolCleaner cleaner = cleaner(p)) {
1294 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1295 p.execute(r);
1296 assertFalse(r.done);
1297 }
1298 }
1299
1300 /**
1301 * execute(null) throws NPE
1302 */
1303 public void testExecuteNull() {
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
1318 */
1319 public void testCorePoolSizeIllegalArgumentException() {
1320 final ThreadPoolExecutor p =
1321 new ThreadPoolExecutor(1, 2,
1322 LONG_DELAY_MS, MILLISECONDS,
1323 new ArrayBlockingQueue<Runnable>(10));
1324 try (PoolCleaner cleaner = cleaner(p)) {
1325 try {
1326 p.setCorePoolSize(-1);
1327 shouldThrow();
1328 } catch (IllegalArgumentException success) {}
1329 }
1330 }
1331
1332 /**
1333 * setMaximumPoolSize(int) throws IllegalArgumentException if
1334 * given a value less the core pool size
1335 */
1336 public void testMaximumPoolSizeIllegalArgumentException() {
1337 final ThreadPoolExecutor p =
1338 new ThreadPoolExecutor(2, 3,
1339 LONG_DELAY_MS, MILLISECONDS,
1340 new ArrayBlockingQueue<Runnable>(10));
1341 try (PoolCleaner cleaner = cleaner(p)) {
1342 try {
1343 p.setMaximumPoolSize(1);
1344 shouldThrow();
1345 } catch (IllegalArgumentException success) {}
1346 }
1347 }
1348
1349 /**
1350 * setMaximumPoolSize throws IllegalArgumentException
1351 * if given a negative value
1352 */
1353 public void testMaximumPoolSizeIllegalArgumentException2() {
1354 final ThreadPoolExecutor p =
1355 new ThreadPoolExecutor(2, 3,
1356 LONG_DELAY_MS, MILLISECONDS,
1357 new ArrayBlockingQueue<Runnable>(10));
1358 try (PoolCleaner cleaner = cleaner(p)) {
1359 try {
1360 p.setMaximumPoolSize(-1);
1361 shouldThrow();
1362 } catch (IllegalArgumentException success) {}
1363 }
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
1398 */
1399 public void testKeepAliveTimeIllegalArgumentException() {
1400 final ThreadPoolExecutor p =
1401 new ThreadPoolExecutor(2, 3,
1402 LONG_DELAY_MS, MILLISECONDS,
1403 new ArrayBlockingQueue<Runnable>(10));
1404 try (PoolCleaner cleaner = cleaner(p)) {
1405 try {
1406 p.setKeepAliveTime(-1, MILLISECONDS);
1407 shouldThrow();
1408 } catch (IllegalArgumentException success) {}
1409 }
1410 }
1411
1412 /**
1413 * terminated() is called on termination
1414 */
1415 public void testTerminated() {
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 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
1442 /**
1443 * completed submit of callable returns result
1444 */
1445 public void testSubmitCallable() throws Exception {
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);
1454 }
1455 }
1456
1457 /**
1458 * completed submit of runnable returns successfully
1459 */
1460 public void testSubmitRunnable() throws Exception {
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());
1469 }
1470 }
1471
1472 /**
1473 * completed submit of (runnable, result) returns result
1474 */
1475 public void testSubmitRunnable2() throws Exception {
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);
1484 }
1485 }
1486
1487 /**
1488 * invokeAny(null) throws NPE
1489 */
1490 public void testInvokeAny1() throws Exception {
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 IllegalArgumentException
1505 */
1506 public void testInvokeAny2() throws Exception {
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
1519 /**
1520 * invokeAny(c) throws NPE if c has null elements
1521 */
1522 public void testInvokeAny3() throws Exception {
1523 final CountDownLatch latch = new CountDownLatch(1);
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 try {
1533 e.invokeAny(l);
1534 shouldThrow();
1535 } catch (NullPointerException success) {}
1536 latch.countDown();
1537 }
1538 }
1539
1540 /**
1541 * invokeAny(c) throws ExecutionException if no task completes
1542 */
1543 public void testInvokeAny4() throws Exception {
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 try {
1552 e.invokeAny(l);
1553 shouldThrow();
1554 } catch (ExecutionException success) {
1555 assertTrue(success.getCause() instanceof NullPointerException);
1556 }
1557 }
1558 }
1559
1560 /**
1561 * invokeAny(c) returns result of some task
1562 */
1563 public void testInvokeAny5() throws Exception {
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);
1574 }
1575 }
1576
1577 /**
1578 * invokeAll(null) throws NPE
1579 */
1580 public void testInvokeAll1() throws Exception {
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 list
1595 */
1596 public void testInvokeAll2() throws InterruptedException {
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());
1606 }
1607 }
1608
1609 /**
1610 * invokeAll(c) throws NPE if c has null elements
1611 */
1612 public void testInvokeAll3() throws Exception {
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 try {
1622 e.invokeAll(l);
1623 shouldThrow();
1624 } catch (NullPointerException success) {}
1625 }
1626 }
1627
1628 /**
1629 * get of element of invokeAll(c) throws exception on failed task
1630 */
1631 public void testInvokeAll4() throws Exception {
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>> 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 }
1647 }
1648 }
1649
1650 /**
1651 * invokeAll(c) returns results of all completed tasks
1652 */
1653 public void testInvokeAll5() throws Exception {
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>> futures = e.invokeAll(l);
1663 assertEquals(2, futures.size());
1664 for (Future<String> future : futures)
1665 assertSame(TEST_STRING, future.get());
1666 }
1667 }
1668
1669 /**
1670 * timed invokeAny(null) throws NPE
1671 */
1672 public void testTimedInvokeAny1() throws Exception {
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
1685 /**
1686 * timed invokeAny(,,null) throws NPE
1687 */
1688 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
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 try {
1697 e.invokeAny(l, randomTimeout(), null);
1698 shouldThrow();
1699 } catch (NullPointerException success) {}
1700 }
1701 }
1702
1703 /**
1704 * timed invokeAny(empty collection) throws IllegalArgumentException
1705 */
1706 public void testTimedInvokeAny2() throws Exception {
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 NullPointerException if c has null elements
1722 */
1723 public void testTimedInvokeAny3() throws Exception {
1724 final CountDownLatch latch = new CountDownLatch(1);
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 try {
1734 e.invokeAny(l, randomTimeout(), randomTimeUnit());
1735 shouldThrow();
1736 } catch (NullPointerException success) {}
1737 latch.countDown();
1738 }
1739 }
1740
1741 /**
1742 * timed invokeAny(c) throws ExecutionException if no task completes
1743 */
1744 public void testTimedInvokeAny4() throws Exception {
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 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
1763 /**
1764 * timed invokeAny(c) returns result of some task
1765 */
1766 public void testTimedInvokeAny5() throws Exception {
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, LONG_DELAY_MS, MILLISECONDS);
1777 assertSame(TEST_STRING, result);
1778 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1779 }
1780 }
1781
1782 /**
1783 * timed invokeAll(null) throws NPE
1784 */
1785 public void testTimedInvokeAll1() throws Exception {
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
1798 /**
1799 * timed invokeAll(,,null) throws NPE
1800 */
1801 public void testTimedInvokeAllNullTimeUnit() throws Exception {
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 try {
1810 e.invokeAll(l, randomTimeout(), null);
1811 shouldThrow();
1812 } catch (NullPointerException success) {}
1813 }
1814 }
1815
1816 /**
1817 * timed invokeAll(empty collection) returns empty list
1818 */
1819 public void testTimedInvokeAll2() throws InterruptedException {
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());
1830 }
1831 }
1832
1833 /**
1834 * timed invokeAll(c) throws NPE if c has null elements
1835 */
1836 public void testTimedInvokeAll3() throws Exception {
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 try {
1846 e.invokeAll(l, randomTimeout(), randomTimeUnit());
1847 shouldThrow();
1848 } catch (NullPointerException success) {}
1849 }
1850 }
1851
1852 /**
1853 * get of element of invokeAll(c) throws exception on failed task
1854 */
1855 public void testTimedInvokeAll4() throws Exception {
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>> 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
1875 /**
1876 * timed invokeAll(c) returns results of all completed tasks
1877 */
1878 public void testTimedInvokeAll5() throws Exception {
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>> 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
1895 /**
1896 * timed invokeAll(c) cancels tasks not completed by timeout
1897 */
1898 public void testTimedInvokeAll6() throws Exception {
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
1936 /**
1937 * Execution continues if there is at least one thread even if
1938 * thread factory fails to create more
1939 */
1940 public void testFailingThreadFactory() throws InterruptedException {
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
1958 /**
1959 * allowsCoreThreadTimeOut is by default false.
1960 */
1961 public void testAllowsCoreThreadTimeOut() {
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 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 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
2021 /**
2022 * execute allows the same task to be submitted multiple times, even
2023 * if rejected
2024 */
2025 public void testRejectedRecycledTask() throws InterruptedException {
2026 final int nTasks = 1000;
2027 final CountDownLatch done = new CountDownLatch(nTasks);
2028 final Runnable recycledTask = new Runnable() {
2029 public void run() {
2030 done.countDown();
2031 }};
2032 final ThreadPoolExecutor p =
2033 new ThreadPoolExecutor(1, 30,
2034 60, SECONDS,
2035 new ArrayBlockingQueue(30));
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) {}
2044 }
2045 }
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 public void testAbortPolicy() {
2089 final RejectedExecutionHandler handler = new AbortPolicy();
2090 final ThreadPoolExecutor p =
2091 new ThreadPoolExecutor(1, 1,
2092 LONG_DELAY_MS, MILLISECONDS,
2093 new ArrayBlockingQueue<Runnable>(10));
2094 final TrackedNoOpRunnable r = new TrackedNoOpRunnable();
2095 try {
2096 handler.rejectedExecution(r, p);
2097 shouldThrow();
2098 } catch (RejectedExecutionException success) {}
2099 assertFalse(r.done);
2100 assertEquals(0, p.getTaskCount());
2101 assertTrue(p.getQueue().isEmpty());
2102 }
2103
2104 public void testCallerRunsPolicy() {
2105 final RejectedExecutionHandler handler = new CallerRunsPolicy();
2106 final ThreadPoolExecutor p =
2107 new ThreadPoolExecutor(1, 1,
2108 LONG_DELAY_MS, MILLISECONDS,
2109 new ArrayBlockingQueue<Runnable>(10));
2110 final AtomicReference<Thread> thread = new AtomicReference<>();
2111 final Runnable r = new Runnable() { public void run() {
2112 thread.set(Thread.currentThread()); }};
2113 handler.rejectedExecution(r, p);
2114 assertSame(Thread.currentThread(), thread.get());
2115 assertTrue(p.getRejectedExecutionHandler() instanceof AbortPolicy);
2116 assertEquals(0, p.getTaskCount());
2117 assertTrue(p.getQueue().isEmpty());
2118 }
2119
2120 }