ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.83
Committed: Sun Oct 4 02:29:46 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.82: +8 -8 lines
Log Message:
improve testIsTerminated

File Contents

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