ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.103
Committed: Mon Oct 5 22:19:00 2015 UTC (8 years, 7 months ago) by jsr166
Branch: MAIN
Changes since 1.102: +6 -8 lines
Log Message:
improve testGetPoolSize, testGetLargestPoolSize

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