ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.52
Committed: Fri May 15 17:07:27 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.51: +29 -56 lines
Log Message:
make constructor tests more readable

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