ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.99
Committed: Mon May 29 22:44:27 2017 UTC (6 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.98: +23 -16 lines
Log Message:
more timeout handling rework; remove most uses of MEDIUM_DELAY_MS; randomize timeouts and TimeUnits; write out IAE and ISE

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