ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.37
Committed: Fri May 15 18:21:19 2015 UTC (9 years ago) by jsr166
Branch: MAIN
Changes since 1.36: +3 -2 lines
Log Message:
try/catch block scope hygiene

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