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