ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorSubclassTest.java
Revision: 1.83
Committed: Mon Oct 5 20:45:41 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.82: +1 -1 lines
Log Message:
fix minor 4jdk7-tck bitrot

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,
757 LONG_DELAY_MS, MILLISECONDS,
758 new ArrayBlockingQueue<Runnable>(10));
759 final CountDownLatch threadsStarted = new CountDownLatch(poolSize);
760 Runnable waiter = new CheckedRunnable() { public void realRun() {
761 threadsStarted.countDown();
762 try {
763 MILLISECONDS.sleep(2 * LONG_DELAY_MS);
764 } catch (InterruptedException success) {}
765 ran.getAndIncrement();
766 }};
767 for (int i = 0; i < count; i++)
768 p.execute(waiter);
769 assertTrue(threadsStarted.await(LONG_DELAY_MS, MILLISECONDS));
770 assertEquals(poolSize, p.getActiveCount());
771 assertEquals(0, p.getCompletedTaskCount());
772 final List<Runnable> queuedTasks;
773 try {
774 queuedTasks = p.shutdownNow();
775 } catch (SecurityException ok) {
776 return; // Allowed in case test doesn't have privs
777 }
778 assertTrue(p.isShutdown());
779 assertTrue(p.getQueue().isEmpty());
780 assertEquals(count - poolSize, queuedTasks.size());
781 assertTrue(p.awaitTermination(LONG_DELAY_MS, MILLISECONDS));
782 assertTrue(p.isTerminated());
783 assertEquals(poolSize, ran.get());
784 assertEquals(poolSize, p.getCompletedTaskCount());
785 }
786
787 // Exception Tests
788
789 /**
790 * Constructor throws if corePoolSize argument is less than zero
791 */
792 public void testConstructor1() {
793 try {
794 new CustomTPE(-1, 1, 1L, SECONDS,
795 new ArrayBlockingQueue<Runnable>(10));
796 shouldThrow();
797 } catch (IllegalArgumentException success) {}
798 }
799
800 /**
801 * Constructor throws if maximumPoolSize is less than zero
802 */
803 public void testConstructor2() {
804 try {
805 new CustomTPE(1, -1, 1L, SECONDS,
806 new ArrayBlockingQueue<Runnable>(10));
807 shouldThrow();
808 } catch (IllegalArgumentException success) {}
809 }
810
811 /**
812 * Constructor throws if maximumPoolSize is equal to zero
813 */
814 public void testConstructor3() {
815 try {
816 new CustomTPE(1, 0, 1L, SECONDS,
817 new ArrayBlockingQueue<Runnable>(10));
818 shouldThrow();
819 } catch (IllegalArgumentException success) {}
820 }
821
822 /**
823 * Constructor throws if keepAliveTime is less than zero
824 */
825 public void testConstructor4() {
826 try {
827 new CustomTPE(1, 2, -1L, SECONDS,
828 new ArrayBlockingQueue<Runnable>(10));
829 shouldThrow();
830 } catch (IllegalArgumentException success) {}
831 }
832
833 /**
834 * Constructor throws if corePoolSize is greater than the maximumPoolSize
835 */
836 public void testConstructor5() {
837 try {
838 new CustomTPE(2, 1, 1L, SECONDS,
839 new ArrayBlockingQueue<Runnable>(10));
840 shouldThrow();
841 } catch (IllegalArgumentException success) {}
842 }
843
844 /**
845 * Constructor throws if workQueue is set to null
846 */
847 public void testConstructorNullPointerException() {
848 try {
849 new CustomTPE(1, 2, 1L, SECONDS, null);
850 shouldThrow();
851 } catch (NullPointerException success) {}
852 }
853
854 /**
855 * Constructor throws if corePoolSize argument is less than zero
856 */
857 public void testConstructor6() {
858 try {
859 new CustomTPE(-1, 1, 1L, SECONDS,
860 new ArrayBlockingQueue<Runnable>(10),
861 new SimpleThreadFactory());
862 shouldThrow();
863 } catch (IllegalArgumentException success) {}
864 }
865
866 /**
867 * Constructor throws if maximumPoolSize is less than zero
868 */
869 public void testConstructor7() {
870 try {
871 new CustomTPE(1,-1, 1L, SECONDS,
872 new ArrayBlockingQueue<Runnable>(10),
873 new SimpleThreadFactory());
874 shouldThrow();
875 } catch (IllegalArgumentException success) {}
876 }
877
878 /**
879 * Constructor throws if maximumPoolSize is equal to zero
880 */
881 public void testConstructor8() {
882 try {
883 new CustomTPE(1, 0, 1L, SECONDS,
884 new ArrayBlockingQueue<Runnable>(10),
885 new SimpleThreadFactory());
886 shouldThrow();
887 } catch (IllegalArgumentException success) {}
888 }
889
890 /**
891 * Constructor throws if keepAliveTime is less than zero
892 */
893 public void testConstructor9() {
894 try {
895 new CustomTPE(1, 2, -1L, SECONDS,
896 new ArrayBlockingQueue<Runnable>(10),
897 new SimpleThreadFactory());
898 shouldThrow();
899 } catch (IllegalArgumentException success) {}
900 }
901
902 /**
903 * Constructor throws if corePoolSize is greater than the maximumPoolSize
904 */
905 public void testConstructor10() {
906 try {
907 new CustomTPE(2, 1, 1L, SECONDS,
908 new ArrayBlockingQueue<Runnable>(10),
909 new SimpleThreadFactory());
910 shouldThrow();
911 } catch (IllegalArgumentException success) {}
912 }
913
914 /**
915 * Constructor throws if workQueue is set to null
916 */
917 public void testConstructorNullPointerException2() {
918 try {
919 new CustomTPE(1, 2, 1L, SECONDS, null, new SimpleThreadFactory());
920 shouldThrow();
921 } catch (NullPointerException success) {}
922 }
923
924 /**
925 * Constructor throws if threadFactory is set to null
926 */
927 public void testConstructorNullPointerException3() {
928 try {
929 new CustomTPE(1, 2, 1L, SECONDS,
930 new ArrayBlockingQueue<Runnable>(10),
931 (ThreadFactory) null);
932 shouldThrow();
933 } catch (NullPointerException success) {}
934 }
935
936 /**
937 * Constructor throws if corePoolSize argument is less than zero
938 */
939 public void testConstructor11() {
940 try {
941 new CustomTPE(-1, 1, 1L, SECONDS,
942 new ArrayBlockingQueue<Runnable>(10),
943 new NoOpREHandler());
944 shouldThrow();
945 } catch (IllegalArgumentException success) {}
946 }
947
948 /**
949 * Constructor throws if maximumPoolSize is less than zero
950 */
951 public void testConstructor12() {
952 try {
953 new CustomTPE(1, -1, 1L, SECONDS,
954 new ArrayBlockingQueue<Runnable>(10),
955 new NoOpREHandler());
956 shouldThrow();
957 } catch (IllegalArgumentException success) {}
958 }
959
960 /**
961 * Constructor throws if maximumPoolSize is equal to zero
962 */
963 public void testConstructor13() {
964 try {
965 new CustomTPE(1, 0, 1L, SECONDS,
966 new ArrayBlockingQueue<Runnable>(10),
967 new NoOpREHandler());
968 shouldThrow();
969 } catch (IllegalArgumentException success) {}
970 }
971
972 /**
973 * Constructor throws if keepAliveTime is less than zero
974 */
975 public void testConstructor14() {
976 try {
977 new CustomTPE(1, 2, -1L, SECONDS,
978 new ArrayBlockingQueue<Runnable>(10),
979 new NoOpREHandler());
980 shouldThrow();
981 } catch (IllegalArgumentException success) {}
982 }
983
984 /**
985 * Constructor throws if corePoolSize is greater than the maximumPoolSize
986 */
987 public void testConstructor15() {
988 try {
989 new CustomTPE(2, 1, 1L, SECONDS,
990 new ArrayBlockingQueue<Runnable>(10),
991 new NoOpREHandler());
992 shouldThrow();
993 } catch (IllegalArgumentException success) {}
994 }
995
996 /**
997 * Constructor throws if workQueue is set to null
998 */
999 public void testConstructorNullPointerException4() {
1000 try {
1001 new CustomTPE(1, 2, 1L, SECONDS,
1002 null,
1003 new NoOpREHandler());
1004 shouldThrow();
1005 } catch (NullPointerException success) {}
1006 }
1007
1008 /**
1009 * Constructor throws if handler is set to null
1010 */
1011 public void testConstructorNullPointerException5() {
1012 try {
1013 new CustomTPE(1, 2, 1L, SECONDS,
1014 new ArrayBlockingQueue<Runnable>(10),
1015 (RejectedExecutionHandler) null);
1016 shouldThrow();
1017 } catch (NullPointerException success) {}
1018 }
1019
1020 /**
1021 * Constructor throws if corePoolSize argument is less than zero
1022 */
1023 public void testConstructor16() {
1024 try {
1025 new CustomTPE(-1, 1, 1L, SECONDS,
1026 new ArrayBlockingQueue<Runnable>(10),
1027 new SimpleThreadFactory(),
1028 new NoOpREHandler());
1029 shouldThrow();
1030 } catch (IllegalArgumentException success) {}
1031 }
1032
1033 /**
1034 * Constructor throws if maximumPoolSize is less than zero
1035 */
1036 public void testConstructor17() {
1037 try {
1038 new CustomTPE(1, -1, 1L, SECONDS,
1039 new ArrayBlockingQueue<Runnable>(10),
1040 new SimpleThreadFactory(),
1041 new NoOpREHandler());
1042 shouldThrow();
1043 } catch (IllegalArgumentException success) {}
1044 }
1045
1046 /**
1047 * Constructor throws if maximumPoolSize is equal to zero
1048 */
1049 public void testConstructor18() {
1050 try {
1051 new CustomTPE(1, 0, 1L, SECONDS,
1052 new ArrayBlockingQueue<Runnable>(10),
1053 new SimpleThreadFactory(),
1054 new NoOpREHandler());
1055 shouldThrow();
1056 } catch (IllegalArgumentException success) {}
1057 }
1058
1059 /**
1060 * Constructor throws if keepAliveTime is less than zero
1061 */
1062 public void testConstructor19() {
1063 try {
1064 new CustomTPE(1, 2, -1L, SECONDS,
1065 new ArrayBlockingQueue<Runnable>(10),
1066 new SimpleThreadFactory(),
1067 new NoOpREHandler());
1068 shouldThrow();
1069 } catch (IllegalArgumentException success) {}
1070 }
1071
1072 /**
1073 * Constructor throws if corePoolSize is greater than the maximumPoolSize
1074 */
1075 public void testConstructor20() {
1076 try {
1077 new CustomTPE(2, 1, 1L, SECONDS,
1078 new ArrayBlockingQueue<Runnable>(10),
1079 new SimpleThreadFactory(),
1080 new NoOpREHandler());
1081 shouldThrow();
1082 } catch (IllegalArgumentException success) {}
1083 }
1084
1085 /**
1086 * Constructor throws if workQueue is null
1087 */
1088 public void testConstructorNullPointerException6() {
1089 try {
1090 new CustomTPE(1, 2, 1L, SECONDS,
1091 null,
1092 new SimpleThreadFactory(),
1093 new NoOpREHandler());
1094 shouldThrow();
1095 } catch (NullPointerException success) {}
1096 }
1097
1098 /**
1099 * Constructor throws if handler is null
1100 */
1101 public void testConstructorNullPointerException7() {
1102 try {
1103 new CustomTPE(1, 2, 1L, SECONDS,
1104 new ArrayBlockingQueue<Runnable>(10),
1105 new SimpleThreadFactory(),
1106 (RejectedExecutionHandler) null);
1107 shouldThrow();
1108 } catch (NullPointerException success) {}
1109 }
1110
1111 /**
1112 * Constructor throws if ThreadFactory is null
1113 */
1114 public void testConstructorNullPointerException8() {
1115 try {
1116 new CustomTPE(1, 2, 1L, SECONDS,
1117 new ArrayBlockingQueue<Runnable>(10),
1118 (ThreadFactory) null,
1119 new NoOpREHandler());
1120 shouldThrow();
1121 } catch (NullPointerException success) {}
1122 }
1123
1124 /**
1125 * execute throws RejectedExecutionException if saturated.
1126 */
1127 public void testSaturatedExecute() {
1128 final ThreadPoolExecutor p =
1129 new CustomTPE(1, 1,
1130 LONG_DELAY_MS, MILLISECONDS,
1131 new ArrayBlockingQueue<Runnable>(1));
1132 try (PoolCleaner cleaner = cleaner(p)) {
1133 final CountDownLatch done = new CountDownLatch(1);
1134 Runnable task = new CheckedRunnable() {
1135 public void realRun() throws InterruptedException {
1136 done.await();
1137 }};
1138 for (int i = 0; i < 2; ++i)
1139 p.execute(task);
1140 for (int i = 0; i < 2; ++i) {
1141 try {
1142 p.execute(task);
1143 shouldThrow();
1144 } catch (RejectedExecutionException success) {}
1145 assertTrue(p.getTaskCount() <= 2);
1146 }
1147 done.countDown();
1148 }
1149 }
1150
1151 /**
1152 * executor using CallerRunsPolicy runs task if saturated.
1153 */
1154 public void testSaturatedExecute2() {
1155 final ThreadPoolExecutor p =
1156 new CustomTPE(1, 1,
1157 LONG_DELAY_MS, MILLISECONDS,
1158 new ArrayBlockingQueue<Runnable>(1),
1159 new CustomTPE.CallerRunsPolicy());
1160 try (PoolCleaner cleaner = cleaner(p)) {
1161 final CountDownLatch done = new CountDownLatch(1);
1162 Runnable blocker = new CheckedRunnable() {
1163 public void realRun() throws InterruptedException {
1164 done.await();
1165 }};
1166 p.execute(blocker);
1167 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1168 for (int i = 0; i < tasks.length; i++)
1169 tasks[i] = new TrackedNoOpRunnable();
1170 for (int i = 0; i < tasks.length; i++)
1171 p.execute(tasks[i]);
1172 for (int i = 1; i < tasks.length; i++)
1173 assertTrue(tasks[i].done);
1174 assertFalse(tasks[0].done); // waiting in queue
1175 done.countDown();
1176 }
1177 }
1178
1179 /**
1180 * executor using DiscardPolicy drops task if saturated.
1181 */
1182 public void testSaturatedExecute3() {
1183 final TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
1184 for (int i = 0; i < tasks.length; ++i)
1185 tasks[i] = new TrackedNoOpRunnable();
1186 final ThreadPoolExecutor p =
1187 new CustomTPE(1, 1,
1188 LONG_DELAY_MS, MILLISECONDS,
1189 new ArrayBlockingQueue<Runnable>(1),
1190 new CustomTPE.DiscardPolicy());
1191 try (PoolCleaner cleaner = cleaner(p)) {
1192 final CountDownLatch done = new CountDownLatch(1);
1193 p.execute(awaiter(done));
1194
1195 for (TrackedNoOpRunnable task : tasks)
1196 p.execute(task);
1197 for (int i = 1; i < tasks.length; i++)
1198 assertFalse(tasks[i].done);
1199 done.countDown();
1200 }
1201 for (int i = 1; i < tasks.length; i++)
1202 assertFalse(tasks[i].done);
1203 assertTrue(tasks[0].done); // was waiting in queue
1204 }
1205
1206 /**
1207 * executor using DiscardOldestPolicy drops oldest task if saturated.
1208 */
1209 public void testSaturatedExecute4() {
1210 final CountDownLatch done = new CountDownLatch(1);
1211 LatchAwaiter r1 = awaiter(done);
1212 LatchAwaiter r2 = awaiter(done);
1213 LatchAwaiter r3 = awaiter(done);
1214 final ThreadPoolExecutor p =
1215 new CustomTPE(1, 1,
1216 LONG_DELAY_MS, MILLISECONDS,
1217 new ArrayBlockingQueue<Runnable>(1),
1218 new CustomTPE.DiscardOldestPolicy());
1219 try (PoolCleaner cleaner = cleaner(p)) {
1220 assertEquals(LatchAwaiter.NEW, r1.state);
1221 assertEquals(LatchAwaiter.NEW, r2.state);
1222 assertEquals(LatchAwaiter.NEW, r3.state);
1223 p.execute(r1);
1224 p.execute(r2);
1225 assertTrue(p.getQueue().contains(r2));
1226 p.execute(r3);
1227 assertFalse(p.getQueue().contains(r2));
1228 assertTrue(p.getQueue().contains(r3));
1229 done.countDown();
1230 }
1231 assertEquals(LatchAwaiter.DONE, r1.state);
1232 assertEquals(LatchAwaiter.NEW, r2.state);
1233 assertEquals(LatchAwaiter.DONE, r3.state);
1234 }
1235
1236 /**
1237 * execute throws RejectedExecutionException if shutdown
1238 */
1239 public void testRejectedExecutionExceptionOnShutdown() {
1240 final ThreadPoolExecutor p =
1241 new CustomTPE(1, 1,
1242 LONG_DELAY_MS, MILLISECONDS,
1243 new ArrayBlockingQueue<Runnable>(1));
1244 try { p.shutdown(); } catch (SecurityException ok) { return; }
1245 try (PoolCleaner cleaner = cleaner(p)) {
1246 try {
1247 p.execute(new NoOpRunnable());
1248 shouldThrow();
1249 } catch (RejectedExecutionException success) {}
1250 }
1251 }
1252
1253 /**
1254 * execute using CallerRunsPolicy drops task on shutdown
1255 */
1256 public void testCallerRunsOnShutdown() {
1257 final ThreadPoolExecutor p =
1258 new CustomTPE(1, 1,
1259 LONG_DELAY_MS, MILLISECONDS,
1260 new ArrayBlockingQueue<Runnable>(1),
1261 new CustomTPE.CallerRunsPolicy());
1262 try { p.shutdown(); } catch (SecurityException ok) { return; }
1263 try (PoolCleaner cleaner = cleaner(p)) {
1264 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1265 p.execute(r);
1266 assertFalse(r.done);
1267 }
1268 }
1269
1270 /**
1271 * execute using DiscardPolicy drops task on shutdown
1272 */
1273 public void testDiscardOnShutdown() {
1274 final ThreadPoolExecutor p =
1275 new CustomTPE(1, 1,
1276 LONG_DELAY_MS, MILLISECONDS,
1277 new ArrayBlockingQueue<Runnable>(1),
1278 new CustomTPE.DiscardPolicy());
1279 try { p.shutdown(); } catch (SecurityException ok) { return; }
1280 try (PoolCleaner cleaner = cleaner(p)) {
1281 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1282 p.execute(r);
1283 assertFalse(r.done);
1284 }
1285 }
1286
1287 /**
1288 * execute using DiscardOldestPolicy drops task on shutdown
1289 */
1290 public void testDiscardOldestOnShutdown() {
1291 final ThreadPoolExecutor p =
1292 new CustomTPE(1, 1,
1293 LONG_DELAY_MS, MILLISECONDS,
1294 new ArrayBlockingQueue<Runnable>(1),
1295 new CustomTPE.DiscardOldestPolicy());
1296
1297 try { p.shutdown(); } catch (SecurityException ok) { return; }
1298 try (PoolCleaner cleaner = cleaner(p)) {
1299 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1300 p.execute(r);
1301 assertFalse(r.done);
1302 }
1303 }
1304
1305 /**
1306 * execute(null) throws NPE
1307 */
1308 public void testExecuteNull() {
1309 final ThreadPoolExecutor p =
1310 new CustomTPE(1, 2,
1311 1L, SECONDS,
1312 new ArrayBlockingQueue<Runnable>(10));
1313 try (PoolCleaner cleaner = cleaner(p)) {
1314 try {
1315 p.execute(null);
1316 shouldThrow();
1317 } catch (NullPointerException success) {}
1318 }
1319 }
1320
1321 /**
1322 * setCorePoolSize of negative value throws IllegalArgumentException
1323 */
1324 public void testCorePoolSizeIllegalArgumentException() {
1325 final ThreadPoolExecutor p =
1326 new CustomTPE(1, 2,
1327 LONG_DELAY_MS, MILLISECONDS,
1328 new ArrayBlockingQueue<Runnable>(10));
1329 try (PoolCleaner cleaner = cleaner(p)) {
1330 try {
1331 p.setCorePoolSize(-1);
1332 shouldThrow();
1333 } catch (IllegalArgumentException success) {}
1334 }
1335 }
1336
1337 /**
1338 * setMaximumPoolSize(int) throws IllegalArgumentException
1339 * if given a value less the core pool size
1340 */
1341 public void testMaximumPoolSizeIllegalArgumentException() {
1342 final ThreadPoolExecutor p =
1343 new CustomTPE(2, 3,
1344 LONG_DELAY_MS, MILLISECONDS,
1345 new ArrayBlockingQueue<Runnable>(10));
1346 try (PoolCleaner cleaner = cleaner(p)) {
1347 try {
1348 p.setMaximumPoolSize(1);
1349 shouldThrow();
1350 } catch (IllegalArgumentException success) {}
1351 }
1352 }
1353
1354 /**
1355 * setMaximumPoolSize throws IllegalArgumentException
1356 * if given a negative value
1357 */
1358 public void testMaximumPoolSizeIllegalArgumentException2() {
1359 final ThreadPoolExecutor p =
1360 new CustomTPE(2, 3,
1361 LONG_DELAY_MS,
1362 MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
1363 try (PoolCleaner cleaner = cleaner(p)) {
1364 try {
1365 p.setMaximumPoolSize(-1);
1366 shouldThrow();
1367 } catch (IllegalArgumentException success) {}
1368 }
1369 }
1370
1371 /**
1372 * setKeepAliveTime throws IllegalArgumentException
1373 * when given a negative value
1374 */
1375 public void testKeepAliveTimeIllegalArgumentException() {
1376 final ThreadPoolExecutor p =
1377 new CustomTPE(2, 3,
1378 LONG_DELAY_MS, MILLISECONDS,
1379 new ArrayBlockingQueue<Runnable>(10));
1380 try (PoolCleaner cleaner = cleaner(p)) {
1381 try {
1382 p.setKeepAliveTime(-1, MILLISECONDS);
1383 shouldThrow();
1384 } catch (IllegalArgumentException success) {}
1385 }
1386 }
1387
1388 /**
1389 * terminated() is called on termination
1390 */
1391 public void testTerminated() {
1392 CustomTPE p = new CustomTPE();
1393 try (PoolCleaner cleaner = cleaner(p)) {
1394 try { p.shutdown(); } catch (SecurityException ok) { return; }
1395 assertTrue(p.terminatedCalled());
1396 assertTrue(p.isShutdown());
1397 }
1398 }
1399
1400 /**
1401 * beforeExecute and afterExecute are called when executing task
1402 */
1403 public void testBeforeAfter() throws InterruptedException {
1404 CustomTPE p = new CustomTPE();
1405 try (PoolCleaner cleaner = cleaner(p)) {
1406 final CountDownLatch done = new CountDownLatch(1);
1407 p.execute(new CheckedRunnable() {
1408 public void realRun() {
1409 done.countDown();
1410 }});
1411 await(p.afterCalled);
1412 assertEquals(0, done.getCount());
1413 assertTrue(p.afterCalled());
1414 assertTrue(p.beforeCalled());
1415 }
1416 }
1417
1418 /**
1419 * completed submit of callable returns result
1420 */
1421 public void testSubmitCallable() throws Exception {
1422 final ExecutorService e =
1423 new CustomTPE(2, 2,
1424 LONG_DELAY_MS, MILLISECONDS,
1425 new ArrayBlockingQueue<Runnable>(10));
1426 try (PoolCleaner cleaner = cleaner(e)) {
1427 Future<String> future = e.submit(new StringTask());
1428 String result = future.get();
1429 assertSame(TEST_STRING, result);
1430 }
1431 }
1432
1433 /**
1434 * completed submit of runnable returns successfully
1435 */
1436 public void testSubmitRunnable() throws Exception {
1437 final ExecutorService e =
1438 new CustomTPE(2, 2,
1439 LONG_DELAY_MS, MILLISECONDS,
1440 new ArrayBlockingQueue<Runnable>(10));
1441 try (PoolCleaner cleaner = cleaner(e)) {
1442 Future<?> future = e.submit(new NoOpRunnable());
1443 future.get();
1444 assertTrue(future.isDone());
1445 }
1446 }
1447
1448 /**
1449 * completed submit of (runnable, result) returns result
1450 */
1451 public void testSubmitRunnable2() throws Exception {
1452 final ExecutorService e =
1453 new CustomTPE(2, 2,
1454 LONG_DELAY_MS, MILLISECONDS,
1455 new ArrayBlockingQueue<Runnable>(10));
1456 try (PoolCleaner cleaner = cleaner(e)) {
1457 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1458 String result = future.get();
1459 assertSame(TEST_STRING, result);
1460 }
1461 }
1462
1463 /**
1464 * invokeAny(null) throws NPE
1465 */
1466 public void testInvokeAny1() throws Exception {
1467 final ExecutorService e =
1468 new CustomTPE(2, 2,
1469 LONG_DELAY_MS, MILLISECONDS,
1470 new ArrayBlockingQueue<Runnable>(10));
1471 try (PoolCleaner cleaner = cleaner(e)) {
1472 try {
1473 e.invokeAny(null);
1474 shouldThrow();
1475 } catch (NullPointerException success) {}
1476 }
1477 }
1478
1479 /**
1480 * invokeAny(empty collection) throws IAE
1481 */
1482 public void testInvokeAny2() throws Exception {
1483 final ExecutorService e =
1484 new CustomTPE(2, 2,
1485 LONG_DELAY_MS, MILLISECONDS,
1486 new ArrayBlockingQueue<Runnable>(10));
1487 try (PoolCleaner cleaner = cleaner(e)) {
1488 try {
1489 e.invokeAny(new ArrayList<Callable<String>>());
1490 shouldThrow();
1491 } catch (IllegalArgumentException success) {}
1492 }
1493 }
1494
1495 /**
1496 * invokeAny(c) throws NPE if c has null elements
1497 */
1498 public void testInvokeAny3() throws Exception {
1499 CountDownLatch latch = new CountDownLatch(1);
1500 final ExecutorService e =
1501 new CustomTPE(2, 2,
1502 LONG_DELAY_MS, MILLISECONDS,
1503 new ArrayBlockingQueue<Runnable>(10));
1504 try (PoolCleaner cleaner = cleaner(e)) {
1505 List<Callable<String>> l = new ArrayList<Callable<String>>();
1506 l.add(latchAwaitingStringTask(latch));
1507 l.add(null);
1508 try {
1509 e.invokeAny(l);
1510 shouldThrow();
1511 } catch (NullPointerException success) {}
1512 latch.countDown();
1513 }
1514 }
1515
1516 /**
1517 * invokeAny(c) throws ExecutionException if no task completes
1518 */
1519 public void testInvokeAny4() throws Exception {
1520 final ExecutorService e =
1521 new CustomTPE(2, 2,
1522 LONG_DELAY_MS, MILLISECONDS,
1523 new ArrayBlockingQueue<Runnable>(10));
1524 try (PoolCleaner cleaner = cleaner(e)) {
1525 List<Callable<String>> l = new ArrayList<Callable<String>>();
1526 l.add(new NPETask());
1527 try {
1528 e.invokeAny(l);
1529 shouldThrow();
1530 } catch (ExecutionException success) {
1531 assertTrue(success.getCause() instanceof NullPointerException);
1532 }
1533 }
1534 }
1535
1536 /**
1537 * invokeAny(c) returns result of some task
1538 */
1539 public void testInvokeAny5() throws Exception {
1540 final ExecutorService e =
1541 new CustomTPE(2, 2,
1542 LONG_DELAY_MS, MILLISECONDS,
1543 new ArrayBlockingQueue<Runnable>(10));
1544 try (PoolCleaner cleaner = cleaner(e)) {
1545 List<Callable<String>> l = new ArrayList<Callable<String>>();
1546 l.add(new StringTask());
1547 l.add(new StringTask());
1548 String result = e.invokeAny(l);
1549 assertSame(TEST_STRING, result);
1550 }
1551 }
1552
1553 /**
1554 * invokeAll(null) throws NPE
1555 */
1556 public void testInvokeAll1() throws Exception {
1557 final ExecutorService e =
1558 new CustomTPE(2, 2,
1559 LONG_DELAY_MS, MILLISECONDS,
1560 new ArrayBlockingQueue<Runnable>(10));
1561 try (PoolCleaner cleaner = cleaner(e)) {
1562 try {
1563 e.invokeAll(null);
1564 shouldThrow();
1565 } catch (NullPointerException success) {}
1566 }
1567 }
1568
1569 /**
1570 * invokeAll(empty collection) returns empty collection
1571 */
1572 public void testInvokeAll2() throws Exception {
1573 final ExecutorService e =
1574 new CustomTPE(2, 2,
1575 LONG_DELAY_MS, MILLISECONDS,
1576 new ArrayBlockingQueue<Runnable>(10));
1577 try (PoolCleaner cleaner = cleaner(e)) {
1578 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1579 assertTrue(r.isEmpty());
1580 }
1581 }
1582
1583 /**
1584 * invokeAll(c) throws NPE if c has null elements
1585 */
1586 public void testInvokeAll3() throws Exception {
1587 final ExecutorService e =
1588 new CustomTPE(2, 2,
1589 LONG_DELAY_MS, MILLISECONDS,
1590 new ArrayBlockingQueue<Runnable>(10));
1591 try (PoolCleaner cleaner = cleaner(e)) {
1592 List<Callable<String>> l = new ArrayList<Callable<String>>();
1593 l.add(new StringTask());
1594 l.add(null);
1595 try {
1596 e.invokeAll(l);
1597 shouldThrow();
1598 } catch (NullPointerException success) {}
1599 }
1600 }
1601
1602 /**
1603 * get of element of invokeAll(c) throws exception on failed task
1604 */
1605 public void testInvokeAll4() throws Exception {
1606 final ExecutorService e =
1607 new CustomTPE(2, 2,
1608 LONG_DELAY_MS, MILLISECONDS,
1609 new ArrayBlockingQueue<Runnable>(10));
1610 try (PoolCleaner cleaner = cleaner(e)) {
1611 List<Callable<String>> l = new ArrayList<Callable<String>>();
1612 l.add(new NPETask());
1613 List<Future<String>> futures = e.invokeAll(l);
1614 assertEquals(1, futures.size());
1615 try {
1616 futures.get(0).get();
1617 shouldThrow();
1618 } catch (ExecutionException success) {
1619 assertTrue(success.getCause() instanceof NullPointerException);
1620 }
1621 }
1622 }
1623
1624 /**
1625 * invokeAll(c) returns results of all completed tasks
1626 */
1627 public void testInvokeAll5() throws Exception {
1628 final ExecutorService e =
1629 new CustomTPE(2, 2,
1630 LONG_DELAY_MS, MILLISECONDS,
1631 new ArrayBlockingQueue<Runnable>(10));
1632 try (PoolCleaner cleaner = cleaner(e)) {
1633 List<Callable<String>> l = new ArrayList<Callable<String>>();
1634 l.add(new StringTask());
1635 l.add(new StringTask());
1636 List<Future<String>> futures = e.invokeAll(l);
1637 assertEquals(2, futures.size());
1638 for (Future<String> future : futures)
1639 assertSame(TEST_STRING, future.get());
1640 }
1641 }
1642
1643 /**
1644 * timed invokeAny(null) throws NPE
1645 */
1646 public void testTimedInvokeAny1() throws Exception {
1647 final ExecutorService e =
1648 new CustomTPE(2, 2,
1649 LONG_DELAY_MS, MILLISECONDS,
1650 new ArrayBlockingQueue<Runnable>(10));
1651 try (PoolCleaner cleaner = cleaner(e)) {
1652 try {
1653 e.invokeAny(null, MEDIUM_DELAY_MS, MILLISECONDS);
1654 shouldThrow();
1655 } catch (NullPointerException success) {}
1656 }
1657 }
1658
1659 /**
1660 * timed invokeAny(,,null) throws NPE
1661 */
1662 public void testTimedInvokeAnyNullTimeUnit() throws Exception {
1663 final ExecutorService e =
1664 new CustomTPE(2, 2,
1665 LONG_DELAY_MS, MILLISECONDS,
1666 new ArrayBlockingQueue<Runnable>(10));
1667 try (PoolCleaner cleaner = cleaner(e)) {
1668 List<Callable<String>> l = new ArrayList<Callable<String>>();
1669 l.add(new StringTask());
1670 try {
1671 e.invokeAny(l, MEDIUM_DELAY_MS, null);
1672 shouldThrow();
1673 } catch (NullPointerException success) {}
1674 }
1675 }
1676
1677 /**
1678 * timed invokeAny(empty collection) throws IAE
1679 */
1680 public void testTimedInvokeAny2() throws Exception {
1681 final ExecutorService e =
1682 new CustomTPE(2, 2,
1683 LONG_DELAY_MS, MILLISECONDS,
1684 new ArrayBlockingQueue<Runnable>(10));
1685 try (PoolCleaner cleaner = cleaner(e)) {
1686 try {
1687 e.invokeAny(new ArrayList<Callable<String>>(),
1688 MEDIUM_DELAY_MS, MILLISECONDS);
1689 shouldThrow();
1690 } catch (IllegalArgumentException success) {}
1691 }
1692 }
1693
1694 /**
1695 * timed invokeAny(c) throws NPE if c has null elements
1696 */
1697 public void testTimedInvokeAny3() throws Exception {
1698 CountDownLatch latch = new CountDownLatch(1);
1699 final ExecutorService e =
1700 new CustomTPE(2, 2,
1701 LONG_DELAY_MS, MILLISECONDS,
1702 new ArrayBlockingQueue<Runnable>(10));
1703 try (PoolCleaner cleaner = cleaner(e)) {
1704 List<Callable<String>> l = new ArrayList<Callable<String>>();
1705 l.add(latchAwaitingStringTask(latch));
1706 l.add(null);
1707 try {
1708 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1709 shouldThrow();
1710 } catch (NullPointerException success) {}
1711 latch.countDown();
1712 }
1713 }
1714
1715 /**
1716 * timed invokeAny(c) throws ExecutionException if no task completes
1717 */
1718 public void testTimedInvokeAny4() throws Exception {
1719 final ExecutorService e =
1720 new CustomTPE(2, 2,
1721 LONG_DELAY_MS, MILLISECONDS,
1722 new ArrayBlockingQueue<Runnable>(10));
1723 try (PoolCleaner cleaner = cleaner(e)) {
1724 List<Callable<String>> l = new ArrayList<Callable<String>>();
1725 l.add(new NPETask());
1726 try {
1727 e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1728 shouldThrow();
1729 } catch (ExecutionException success) {
1730 assertTrue(success.getCause() instanceof NullPointerException);
1731 }
1732 }
1733 }
1734
1735 /**
1736 * timed invokeAny(c) returns result of some task
1737 */
1738 public void testTimedInvokeAny5() throws Exception {
1739 final ExecutorService e =
1740 new CustomTPE(2, 2,
1741 LONG_DELAY_MS, MILLISECONDS,
1742 new ArrayBlockingQueue<Runnable>(10));
1743 try (PoolCleaner cleaner = cleaner(e)) {
1744 List<Callable<String>> l = new ArrayList<Callable<String>>();
1745 l.add(new StringTask());
1746 l.add(new StringTask());
1747 String result = e.invokeAny(l, MEDIUM_DELAY_MS, MILLISECONDS);
1748 assertSame(TEST_STRING, result);
1749 }
1750 }
1751
1752 /**
1753 * timed invokeAll(null) throws NPE
1754 */
1755 public void testTimedInvokeAll1() throws Exception {
1756 final ExecutorService e =
1757 new CustomTPE(2, 2,
1758 LONG_DELAY_MS, MILLISECONDS,
1759 new ArrayBlockingQueue<Runnable>(10));
1760 try (PoolCleaner cleaner = cleaner(e)) {
1761 try {
1762 e.invokeAll(null, MEDIUM_DELAY_MS, MILLISECONDS);
1763 shouldThrow();
1764 } catch (NullPointerException success) {}
1765 }
1766 }
1767
1768 /**
1769 * timed invokeAll(,,null) throws NPE
1770 */
1771 public void testTimedInvokeAllNullTimeUnit() throws Exception {
1772 final ExecutorService e =
1773 new CustomTPE(2, 2,
1774 LONG_DELAY_MS, MILLISECONDS,
1775 new ArrayBlockingQueue<Runnable>(10));
1776 try (PoolCleaner cleaner = cleaner(e)) {
1777 List<Callable<String>> l = new ArrayList<Callable<String>>();
1778 l.add(new StringTask());
1779 try {
1780 e.invokeAll(l, MEDIUM_DELAY_MS, null);
1781 shouldThrow();
1782 } catch (NullPointerException success) {}
1783 }
1784 }
1785
1786 /**
1787 * timed invokeAll(empty collection) returns empty collection
1788 */
1789 public void testTimedInvokeAll2() throws Exception {
1790 final ExecutorService e =
1791 new CustomTPE(2, 2,
1792 LONG_DELAY_MS, MILLISECONDS,
1793 new ArrayBlockingQueue<Runnable>(10));
1794 try (PoolCleaner cleaner = cleaner(e)) {
1795 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(),
1796 MEDIUM_DELAY_MS, MILLISECONDS);
1797 assertTrue(r.isEmpty());
1798 }
1799 }
1800
1801 /**
1802 * timed invokeAll(c) throws NPE if c has null elements
1803 */
1804 public void testTimedInvokeAll3() throws Exception {
1805 final ExecutorService e =
1806 new CustomTPE(2, 2,
1807 LONG_DELAY_MS, MILLISECONDS,
1808 new ArrayBlockingQueue<Runnable>(10));
1809 try (PoolCleaner cleaner = cleaner(e)) {
1810 List<Callable<String>> l = new ArrayList<Callable<String>>();
1811 l.add(new StringTask());
1812 l.add(null);
1813 try {
1814 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1815 shouldThrow();
1816 } catch (NullPointerException success) {}
1817 }
1818 }
1819
1820 /**
1821 * get of element of invokeAll(c) throws exception on failed task
1822 */
1823 public void testTimedInvokeAll4() throws Exception {
1824 final ExecutorService e =
1825 new CustomTPE(2, 2,
1826 LONG_DELAY_MS, MILLISECONDS,
1827 new ArrayBlockingQueue<Runnable>(10));
1828 try (PoolCleaner cleaner = cleaner(e)) {
1829 List<Callable<String>> l = new ArrayList<Callable<String>>();
1830 l.add(new NPETask());
1831 List<Future<String>> futures =
1832 e.invokeAll(l, MEDIUM_DELAY_MS, MILLISECONDS);
1833 assertEquals(1, futures.size());
1834 try {
1835 futures.get(0).get();
1836 shouldThrow();
1837 } catch (ExecutionException success) {
1838 assertTrue(success.getCause() instanceof NullPointerException);
1839 }
1840 }
1841 }
1842
1843 /**
1844 * timed invokeAll(c) returns results of all completed tasks
1845 */
1846 public void testTimedInvokeAll5() throws Exception {
1847 final ExecutorService e =
1848 new CustomTPE(2, 2,
1849 LONG_DELAY_MS, MILLISECONDS,
1850 new ArrayBlockingQueue<Runnable>(10));
1851 try (PoolCleaner cleaner = cleaner(e)) {
1852 List<Callable<String>> l = new ArrayList<Callable<String>>();
1853 l.add(new StringTask());
1854 l.add(new StringTask());
1855 List<Future<String>> futures =
1856 e.invokeAll(l, LONG_DELAY_MS, MILLISECONDS);
1857 assertEquals(2, futures.size());
1858 for (Future<String> future : futures)
1859 assertSame(TEST_STRING, future.get());
1860 }
1861 }
1862
1863 /**
1864 * timed invokeAll(c) cancels tasks not completed by timeout
1865 */
1866 public void testTimedInvokeAll6() throws Exception {
1867 final ExecutorService e =
1868 new CustomTPE(2, 2,
1869 LONG_DELAY_MS, MILLISECONDS,
1870 new ArrayBlockingQueue<Runnable>(10));
1871 try (PoolCleaner cleaner = cleaner(e)) {
1872 for (long timeout = timeoutMillis();;) {
1873 List<Callable<String>> tasks = new ArrayList<>();
1874 tasks.add(new StringTask("0"));
1875 tasks.add(Executors.callable(new LongPossiblyInterruptedRunnable(), TEST_STRING));
1876 tasks.add(new StringTask("2"));
1877 long startTime = System.nanoTime();
1878 List<Future<String>> futures =
1879 e.invokeAll(tasks, timeout, MILLISECONDS);
1880 assertEquals(tasks.size(), futures.size());
1881 assertTrue(millisElapsedSince(startTime) >= timeout);
1882 for (Future future : futures)
1883 assertTrue(future.isDone());
1884 assertTrue(futures.get(1).isCancelled());
1885 try {
1886 assertEquals("0", futures.get(0).get());
1887 assertEquals("2", futures.get(2).get());
1888 break;
1889 } catch (CancellationException retryWithLongerTimeout) {
1890 timeout *= 2;
1891 if (timeout >= LONG_DELAY_MS / 2)
1892 fail("expected exactly one task to be cancelled");
1893 }
1894 }
1895 }
1896 }
1897
1898 /**
1899 * Execution continues if there is at least one thread even if
1900 * thread factory fails to create more
1901 */
1902 public void testFailingThreadFactory() throws InterruptedException {
1903 final ExecutorService e =
1904 new CustomTPE(100, 100,
1905 LONG_DELAY_MS, MILLISECONDS,
1906 new LinkedBlockingQueue<Runnable>(),
1907 new FailingThreadFactory());
1908 try (PoolCleaner cleaner = cleaner(e)) {
1909 final int TASKS = 100;
1910 final CountDownLatch done = new CountDownLatch(TASKS);
1911 for (int k = 0; k < TASKS; ++k)
1912 e.execute(new CheckedRunnable() {
1913 public void realRun() {
1914 done.countDown();
1915 }});
1916 assertTrue(done.await(LONG_DELAY_MS, MILLISECONDS));
1917 }
1918 }
1919
1920 /**
1921 * allowsCoreThreadTimeOut is by default false.
1922 */
1923 public void testAllowsCoreThreadTimeOut() {
1924 final ThreadPoolExecutor p =
1925 new CustomTPE(2, 2,
1926 1000, MILLISECONDS,
1927 new ArrayBlockingQueue<Runnable>(10));
1928 try (PoolCleaner cleaner = cleaner(p)) {
1929 assertFalse(p.allowsCoreThreadTimeOut());
1930 }
1931 }
1932
1933 /**
1934 * allowCoreThreadTimeOut(true) causes idle threads to time out
1935 */
1936 public void testAllowCoreThreadTimeOut_true() throws Exception {
1937 long keepAliveTime = timeoutMillis();
1938 final ThreadPoolExecutor p =
1939 new CustomTPE(2, 10,
1940 keepAliveTime, MILLISECONDS,
1941 new ArrayBlockingQueue<Runnable>(10));
1942 try (PoolCleaner cleaner = cleaner(p)) {
1943 final CountDownLatch threadStarted = new CountDownLatch(1);
1944 p.allowCoreThreadTimeOut(true);
1945 p.execute(new CheckedRunnable() {
1946 public void realRun() {
1947 threadStarted.countDown();
1948 assertEquals(1, p.getPoolSize());
1949 }});
1950 await(threadStarted);
1951 delay(keepAliveTime);
1952 long startTime = System.nanoTime();
1953 while (p.getPoolSize() > 0
1954 && millisElapsedSince(startTime) < LONG_DELAY_MS)
1955 Thread.yield();
1956 assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
1957 assertEquals(0, p.getPoolSize());
1958 }
1959 }
1960
1961 /**
1962 * allowCoreThreadTimeOut(false) causes idle threads not to time out
1963 */
1964 public void testAllowCoreThreadTimeOut_false() throws Exception {
1965 long keepAliveTime = timeoutMillis();
1966 final ThreadPoolExecutor p =
1967 new CustomTPE(2, 10,
1968 keepAliveTime, MILLISECONDS,
1969 new ArrayBlockingQueue<Runnable>(10));
1970 try (PoolCleaner cleaner = cleaner(p)) {
1971 final CountDownLatch threadStarted = new CountDownLatch(1);
1972 p.allowCoreThreadTimeOut(false);
1973 p.execute(new CheckedRunnable() {
1974 public void realRun() throws InterruptedException {
1975 threadStarted.countDown();
1976 assertTrue(p.getPoolSize() >= 1);
1977 }});
1978 delay(2 * keepAliveTime);
1979 assertTrue(p.getPoolSize() >= 1);
1980 }
1981 }
1982
1983 /**
1984 * get(cancelled task) throws CancellationException
1985 * (in part, a test of CustomTPE itself)
1986 */
1987 public void testGet_cancelled() throws Exception {
1988 final ExecutorService e =
1989 new CustomTPE(1, 1,
1990 LONG_DELAY_MS, MILLISECONDS,
1991 new LinkedBlockingQueue<Runnable>());
1992 try (PoolCleaner cleaner = cleaner(e)) {
1993 final CountDownLatch blockerStarted = new CountDownLatch(1);
1994 final CountDownLatch done = new CountDownLatch(1);
1995 final List<Future<?>> futures = new ArrayList<>();
1996 for (int i = 0; i < 2; i++) {
1997 Runnable r = new CheckedRunnable() { public void realRun()
1998 throws Throwable {
1999 blockerStarted.countDown();
2000 assertTrue(done.await(2 * LONG_DELAY_MS, MILLISECONDS));
2001 }};
2002 futures.add(e.submit(r));
2003 }
2004 assertTrue(blockerStarted.await(LONG_DELAY_MS, MILLISECONDS));
2005 for (Future<?> future : futures) future.cancel(false);
2006 for (Future<?> future : futures) {
2007 try {
2008 future.get();
2009 shouldThrow();
2010 } catch (CancellationException success) {}
2011 try {
2012 future.get(LONG_DELAY_MS, MILLISECONDS);
2013 shouldThrow();
2014 } catch (CancellationException success) {}
2015 assertTrue(future.isCancelled());
2016 assertTrue(future.isDone());
2017 }
2018 done.countDown();
2019 }
2020 }
2021
2022 }