ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.80
Committed: Sun Oct 4 06:39:13 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.79: +115 -34 lines
Log Message:
whitespace

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