ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ThreadPoolExecutorTest.java
Revision: 1.26
Committed: Mon Nov 16 05:30:08 2009 UTC (14 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.25: +66 -66 lines
Log Message:
whitespace

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/licenses/publicdomain
5 * Other contributors include Andrew Wright, Jeffrey Hayes,
6 * Pat Fisher, Mike Judd.
7 */
8
9 import java.util.concurrent.*;
10 import java.util.concurrent.atomic.*;
11 import junit.framework.*;
12 import java.util.*;
13
14 public class ThreadPoolExecutorTest extends JSR166TestCase {
15 public static void main(String[] args) {
16 junit.textui.TestRunner.run (suite());
17 }
18 public static Test suite() {
19 return new TestSuite(ThreadPoolExecutorTest.class);
20 }
21
22 static class ExtendedTPE extends ThreadPoolExecutor {
23 volatile boolean beforeCalled = false;
24 volatile boolean afterCalled = false;
25 volatile boolean terminatedCalled = false;
26 public ExtendedTPE() {
27 super(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());
28 }
29 protected void beforeExecute(Thread t, Runnable r) {
30 beforeCalled = true;
31 }
32 protected void afterExecute(Runnable r, Throwable t) {
33 afterCalled = true;
34 }
35 protected void terminated() {
36 terminatedCalled = true;
37 }
38 }
39
40 static class FailingThreadFactory implements ThreadFactory {
41 int calls = 0;
42 public Thread newThread(Runnable r) {
43 if (++calls > 1) return null;
44 return new Thread(r);
45 }
46 }
47
48
49 /**
50 * execute successfully executes a runnable
51 */
52 public void testExecute() {
53 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
54 try {
55 p1.execute(new Runnable() {
56 public void run() {
57 try {
58 Thread.sleep(SHORT_DELAY_MS);
59 } catch (InterruptedException e) {
60 threadUnexpectedException();
61 }
62 }
63 });
64 Thread.sleep(SMALL_DELAY_MS);
65 } catch (InterruptedException e) {
66 unexpectedException();
67 }
68 joinPool(p1);
69 }
70
71 /**
72 * getActiveCount increases but doesn't overestimate, when a
73 * thread becomes active
74 */
75 public void testGetActiveCount() {
76 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
77 assertEquals(0, p2.getActiveCount());
78 p2.execute(new MediumRunnable());
79 try {
80 Thread.sleep(SHORT_DELAY_MS);
81 } catch (Exception e) {
82 unexpectedException();
83 }
84 assertEquals(1, p2.getActiveCount());
85 joinPool(p2);
86 }
87
88 /**
89 * prestartCoreThread starts a thread if under corePoolSize, else doesn't
90 */
91 public void testPrestartCoreThread() {
92 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
93 assertEquals(0, p2.getPoolSize());
94 assertTrue(p2.prestartCoreThread());
95 assertEquals(1, p2.getPoolSize());
96 assertTrue(p2.prestartCoreThread());
97 assertEquals(2, p2.getPoolSize());
98 assertFalse(p2.prestartCoreThread());
99 assertEquals(2, p2.getPoolSize());
100 joinPool(p2);
101 }
102
103 /**
104 * prestartAllCoreThreads starts all corePoolSize threads
105 */
106 public void testPrestartAllCoreThreads() {
107 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
108 assertEquals(0, p2.getPoolSize());
109 p2.prestartAllCoreThreads();
110 assertEquals(2, p2.getPoolSize());
111 p2.prestartAllCoreThreads();
112 assertEquals(2, p2.getPoolSize());
113 joinPool(p2);
114 }
115
116 /**
117 * getCompletedTaskCount increases, but doesn't overestimate,
118 * when tasks complete
119 */
120 public void testGetCompletedTaskCount() {
121 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
122 assertEquals(0, p2.getCompletedTaskCount());
123 p2.execute(new ShortRunnable());
124 try {
125 Thread.sleep(SMALL_DELAY_MS);
126 } catch (Exception e) {
127 unexpectedException();
128 }
129 assertEquals(1, p2.getCompletedTaskCount());
130 try { p2.shutdown(); } catch (SecurityException ok) { return; }
131 joinPool(p2);
132 }
133
134 /**
135 * getCorePoolSize returns size given in constructor if not otherwise set
136 */
137 public void testGetCorePoolSize() {
138 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
139 assertEquals(1, p1.getCorePoolSize());
140 joinPool(p1);
141 }
142
143 /**
144 * getKeepAliveTime returns value given in constructor if not otherwise set
145 */
146 public void testGetKeepAliveTime() {
147 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
148 assertEquals(1, p2.getKeepAliveTime(TimeUnit.SECONDS));
149 joinPool(p2);
150 }
151
152
153 /**
154 * getThreadFactory returns factory in constructor if not set
155 */
156 public void testGetThreadFactory() {
157 ThreadFactory tf = new SimpleThreadFactory();
158 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), tf, new NoOpREHandler());
159 assertSame(tf, p.getThreadFactory());
160 joinPool(p);
161 }
162
163 /**
164 * setThreadFactory sets the thread factory returned by getThreadFactory
165 */
166 public void testSetThreadFactory() {
167 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
168 ThreadFactory tf = new SimpleThreadFactory();
169 p.setThreadFactory(tf);
170 assertSame(tf, p.getThreadFactory());
171 joinPool(p);
172 }
173
174
175 /**
176 * setThreadFactory(null) throws NPE
177 */
178 public void testSetThreadFactoryNull() {
179 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
180 try {
181 p.setThreadFactory(null);
182 shouldThrow();
183 } catch (NullPointerException success) {
184 } finally {
185 joinPool(p);
186 }
187 }
188
189 /**
190 * getRejectedExecutionHandler returns handler in constructor if not set
191 */
192 public void testGetRejectedExecutionHandler() {
193 RejectedExecutionHandler h = new NoOpREHandler();
194 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10), h);
195 assertSame(h, p.getRejectedExecutionHandler());
196 joinPool(p);
197 }
198
199 /**
200 * setRejectedExecutionHandler sets the handler returned by
201 * getRejectedExecutionHandler
202 */
203 public void testSetRejectedExecutionHandler() {
204 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
205 RejectedExecutionHandler h = new NoOpREHandler();
206 p.setRejectedExecutionHandler(h);
207 assertSame(h, p.getRejectedExecutionHandler());
208 joinPool(p);
209 }
210
211
212 /**
213 * setRejectedExecutionHandler(null) throws NPE
214 */
215 public void testSetRejectedExecutionHandlerNull() {
216 ThreadPoolExecutor p = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
217 try {
218 p.setRejectedExecutionHandler(null);
219 shouldThrow();
220 } catch (NullPointerException success) {
221 } finally {
222 joinPool(p);
223 }
224 }
225
226
227 /**
228 * getLargestPoolSize increases, but doesn't overestimate, when
229 * multiple threads active
230 */
231 public void testGetLargestPoolSize() {
232 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
233 try {
234 assertEquals(0, p2.getLargestPoolSize());
235 p2.execute(new MediumRunnable());
236 p2.execute(new MediumRunnable());
237 Thread.sleep(SHORT_DELAY_MS);
238 assertEquals(2, p2.getLargestPoolSize());
239 } catch (Exception e) {
240 unexpectedException();
241 }
242 joinPool(p2);
243 }
244
245 /**
246 * getMaximumPoolSize returns value given in constructor if not
247 * otherwise set
248 */
249 public void testGetMaximumPoolSize() {
250 ThreadPoolExecutor p2 = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
251 assertEquals(2, p2.getMaximumPoolSize());
252 joinPool(p2);
253 }
254
255 /**
256 * getPoolSize increases, but doesn't overestimate, when threads
257 * become active
258 */
259 public void testGetPoolSize() {
260 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
261 assertEquals(0, p1.getPoolSize());
262 p1.execute(new MediumRunnable());
263 assertEquals(1, p1.getPoolSize());
264 joinPool(p1);
265 }
266
267 /**
268 * getTaskCount increases, but doesn't overestimate, when tasks submitted
269 */
270 public void testGetTaskCount() {
271 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
272 try {
273 assertEquals(0, p1.getTaskCount());
274 p1.execute(new MediumRunnable());
275 Thread.sleep(SHORT_DELAY_MS);
276 assertEquals(1, p1.getTaskCount());
277 } catch (Exception e) {
278 unexpectedException();
279 }
280 joinPool(p1);
281 }
282
283 /**
284 * isShutDown is false before shutdown, true after
285 */
286 public void testIsShutdown() {
287
288 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
289 assertFalse(p1.isShutdown());
290 try { p1.shutdown(); } catch (SecurityException ok) { return; }
291 assertTrue(p1.isShutdown());
292 joinPool(p1);
293 }
294
295
296 /**
297 * isTerminated is false before termination, true after
298 */
299 public void testIsTerminated() {
300 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
301 assertFalse(p1.isTerminated());
302 try {
303 p1.execute(new MediumRunnable());
304 } finally {
305 try { p1.shutdown(); } catch (SecurityException ok) { return; }
306 }
307 try {
308 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
309 assertTrue(p1.isTerminated());
310 } catch (Exception e) {
311 unexpectedException();
312 }
313 }
314
315 /**
316 * isTerminating is not true when running or when terminated
317 */
318 public void testIsTerminating() {
319 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
320 assertFalse(p1.isTerminating());
321 try {
322 p1.execute(new SmallRunnable());
323 assertFalse(p1.isTerminating());
324 } finally {
325 try { p1.shutdown(); } catch (SecurityException ok) { return; }
326 }
327 try {
328 assertTrue(p1.awaitTermination(LONG_DELAY_MS, TimeUnit.MILLISECONDS));
329 assertTrue(p1.isTerminated());
330 assertFalse(p1.isTerminating());
331 } catch (Exception e) {
332 unexpectedException();
333 }
334 }
335
336 /**
337 * getQueue returns the work queue, which contains queued tasks
338 */
339 public void testGetQueue() {
340 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
341 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
342 FutureTask[] tasks = new FutureTask[5];
343 for (int i = 0; i < 5; i++) {
344 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
345 p1.execute(tasks[i]);
346 }
347 try {
348 Thread.sleep(SHORT_DELAY_MS);
349 BlockingQueue<Runnable> wq = p1.getQueue();
350 assertSame(q, wq);
351 assertFalse(wq.contains(tasks[0]));
352 assertTrue(wq.contains(tasks[4]));
353 for (int i = 1; i < 5; ++i)
354 tasks[i].cancel(true);
355 p1.shutdownNow();
356 } catch (Exception e) {
357 unexpectedException();
358 } finally {
359 joinPool(p1);
360 }
361 }
362
363 /**
364 * remove(task) removes queued task, and fails to remove active task
365 */
366 public void testRemove() {
367 BlockingQueue<Runnable> q = new ArrayBlockingQueue<Runnable>(10);
368 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, q);
369 FutureTask[] tasks = new FutureTask[5];
370 for (int i = 0; i < 5; i++) {
371 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
372 p1.execute(tasks[i]);
373 }
374 try {
375 Thread.sleep(SHORT_DELAY_MS);
376 assertFalse(p1.remove(tasks[0]));
377 assertTrue(q.contains(tasks[4]));
378 assertTrue(q.contains(tasks[3]));
379 assertTrue(p1.remove(tasks[4]));
380 assertFalse(p1.remove(tasks[4]));
381 assertFalse(q.contains(tasks[4]));
382 assertTrue(q.contains(tasks[3]));
383 assertTrue(p1.remove(tasks[3]));
384 assertFalse(q.contains(tasks[3]));
385 } catch (Exception e) {
386 unexpectedException();
387 } finally {
388 joinPool(p1);
389 }
390 }
391
392 /**
393 * purge removes cancelled tasks from the queue
394 */
395 public void testPurge() {
396 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
397 FutureTask[] tasks = new FutureTask[5];
398 for (int i = 0; i < 5; i++) {
399 tasks[i] = new FutureTask(new MediumPossiblyInterruptedRunnable(), Boolean.TRUE);
400 p1.execute(tasks[i]);
401 }
402 tasks[4].cancel(true);
403 tasks[3].cancel(true);
404 p1.purge();
405 long count = p1.getTaskCount();
406 assertTrue(count >= 2 && count < 5);
407 joinPool(p1);
408 }
409
410 /**
411 * shutDownNow returns a list containing tasks that were not run
412 */
413 public void testShutDownNow() {
414 ThreadPoolExecutor p1 = new ThreadPoolExecutor(1, 1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
415 List l;
416 try {
417 for (int i = 0; i < 5; i++)
418 p1.execute(new MediumPossiblyInterruptedRunnable());
419 }
420 finally {
421 try {
422 l = p1.shutdownNow();
423 } catch (SecurityException ok) { return; }
424
425 }
426 assertTrue(p1.isShutdown());
427 assertTrue(l.size() <= 4);
428 }
429
430 // Exception Tests
431
432
433 /**
434 * Constructor throws if corePoolSize argument is less than zero
435 */
436 public void testConstructor1() {
437 try {
438 new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
439 shouldThrow();
440 }
441 catch (IllegalArgumentException success) {}
442 }
443
444 /**
445 * Constructor throws if maximumPoolSize is less than zero
446 */
447 public void testConstructor2() {
448 try {
449 new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
450 shouldThrow();
451 }
452 catch (IllegalArgumentException success) {}
453 }
454
455 /**
456 * Constructor throws if maximumPoolSize is equal to zero
457 */
458 public void testConstructor3() {
459 try {
460 new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
461 shouldThrow();
462 }
463 catch (IllegalArgumentException success) {}
464 }
465
466 /**
467 * Constructor throws if keepAliveTime is less than zero
468 */
469 public void testConstructor4() {
470 try {
471 new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
472 shouldThrow();
473 }
474 catch (IllegalArgumentException success) {}
475 }
476
477 /**
478 * Constructor throws if corePoolSize is greater than the maximumPoolSize
479 */
480 public void testConstructor5() {
481 try {
482 new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
483 shouldThrow();
484 }
485 catch (IllegalArgumentException success) {}
486 }
487
488 /**
489 * Constructor throws if workQueue is set to null
490 */
491 public void testConstructorNullPointerException() {
492 try {
493 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null);
494 shouldThrow();
495 }
496 catch (NullPointerException success) {}
497 }
498
499
500
501 /**
502 * Constructor throws if corePoolSize argument is less than zero
503 */
504 public void testConstructor6() {
505 try {
506 new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
507 shouldThrow();
508 } catch (IllegalArgumentException success) {}
509 }
510
511 /**
512 * Constructor throws if maximumPoolSize is less than zero
513 */
514 public void testConstructor7() {
515 try {
516 new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
517 shouldThrow();
518 }
519 catch (IllegalArgumentException success) {}
520 }
521
522 /**
523 * Constructor throws if maximumPoolSize is equal to zero
524 */
525 public void testConstructor8() {
526 try {
527 new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
528 shouldThrow();
529 }
530 catch (IllegalArgumentException success) {}
531 }
532
533 /**
534 * Constructor throws if keepAliveTime is less than zero
535 */
536 public void testConstructor9() {
537 try {
538 new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
539 shouldThrow();
540 }
541 catch (IllegalArgumentException success) {}
542 }
543
544 /**
545 * Constructor throws if corePoolSize is greater than the maximumPoolSize
546 */
547 public void testConstructor10() {
548 try {
549 new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory());
550 shouldThrow();
551 }
552 catch (IllegalArgumentException success) {}
553 }
554
555 /**
556 * Constructor throws if workQueue is set to null
557 */
558 public void testConstructorNullPointerException2() {
559 try {
560 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory());
561 shouldThrow();
562 }
563 catch (NullPointerException success) {}
564 }
565
566 /**
567 * Constructor throws if threadFactory is set to null
568 */
569 public void testConstructorNullPointerException3() {
570 try {
571 ThreadFactory f = null;
572 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f);
573 shouldThrow();
574 }
575 catch (NullPointerException success) {}
576 }
577
578
579 /**
580 * Constructor throws if corePoolSize argument is less than zero
581 */
582 public void testConstructor11() {
583 try {
584 new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
585 shouldThrow();
586 }
587 catch (IllegalArgumentException success) {}
588 }
589
590 /**
591 * Constructor throws if maximumPoolSize is less than zero
592 */
593 public void testConstructor12() {
594 try {
595 new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
596 shouldThrow();
597 }
598 catch (IllegalArgumentException success) {}
599 }
600
601 /**
602 * Constructor throws if maximumPoolSize is equal to zero
603 */
604 public void testConstructor13() {
605 try {
606 new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
607 shouldThrow();
608 }
609 catch (IllegalArgumentException success) {}
610 }
611
612 /**
613 * Constructor throws if keepAliveTime is less than zero
614 */
615 public void testConstructor14() {
616 try {
617 new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
618 shouldThrow();
619 }
620 catch (IllegalArgumentException success) {}
621 }
622
623 /**
624 * Constructor throws if corePoolSize is greater than the maximumPoolSize
625 */
626 public void testConstructor15() {
627 try {
628 new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new NoOpREHandler());
629 shouldThrow();
630 }
631 catch (IllegalArgumentException success) {}
632 }
633
634 /**
635 * Constructor throws if workQueue is set to null
636 */
637 public void testConstructorNullPointerException4() {
638 try {
639 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new NoOpREHandler());
640 shouldThrow();
641 }
642 catch (NullPointerException success) {}
643 }
644
645 /**
646 * Constructor throws if handler is set to null
647 */
648 public void testConstructorNullPointerException5() {
649 try {
650 RejectedExecutionHandler r = null;
651 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),r);
652 shouldThrow();
653 }
654 catch (NullPointerException success) {}
655 }
656
657
658 /**
659 * Constructor throws if corePoolSize argument is less than zero
660 */
661 public void testConstructor16() {
662 try {
663 new ThreadPoolExecutor(-1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
664 shouldThrow();
665 }
666 catch (IllegalArgumentException success) {}
667 }
668
669 /**
670 * Constructor throws if maximumPoolSize is less than zero
671 */
672 public void testConstructor17() {
673 try {
674 new ThreadPoolExecutor(1,-1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
675 shouldThrow();
676 }
677 catch (IllegalArgumentException success) {}
678 }
679
680 /**
681 * Constructor throws if maximumPoolSize is equal to zero
682 */
683 public void testConstructor18() {
684 try {
685 new ThreadPoolExecutor(1,0,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
686 shouldThrow();
687 }
688 catch (IllegalArgumentException success) {}
689 }
690
691 /**
692 * Constructor throws if keepAliveTime is less than zero
693 */
694 public void testConstructor19() {
695 try {
696 new ThreadPoolExecutor(1,2,-1L,TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
697 shouldThrow();
698 }
699 catch (IllegalArgumentException success) {}
700 }
701
702 /**
703 * Constructor throws if corePoolSize is greater than the maximumPoolSize
704 */
705 public void testConstructor20() {
706 try {
707 new ThreadPoolExecutor(2,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),new NoOpREHandler());
708 shouldThrow();
709 }
710 catch (IllegalArgumentException success) {}
711 }
712
713 /**
714 * Constructor throws if workQueue is set to null
715 */
716 public void testConstructorNullPointerException6() {
717 try {
718 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,null,new SimpleThreadFactory(),new NoOpREHandler());
719 shouldThrow();
720 }
721 catch (NullPointerException success) {}
722 }
723
724 /**
725 * Constructor throws if handler is set to null
726 */
727 public void testConstructorNullPointerException7() {
728 try {
729 RejectedExecutionHandler r = null;
730 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),new SimpleThreadFactory(),r);
731 shouldThrow();
732 }
733 catch (NullPointerException success) {}
734 }
735
736 /**
737 * Constructor throws if ThreadFactory is set top null
738 */
739 public void testConstructorNullPointerException8() {
740 try {
741 ThreadFactory f = null;
742 new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10),f,new NoOpREHandler());
743 shouldThrow();
744 }
745 catch (NullPointerException successdn8) {}
746 }
747
748
749 /**
750 * execute throws RejectedExecutionException
751 * if saturated.
752 */
753 public void testSaturatedExecute() {
754 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1));
755 try {
756
757 for (int i = 0; i < 5; ++i) {
758 p.execute(new MediumRunnable());
759 }
760 shouldThrow();
761 } catch (RejectedExecutionException success) {}
762 joinPool(p);
763 }
764
765 /**
766 * executor using CallerRunsPolicy runs task if saturated.
767 */
768 public void testSaturatedExecute2() {
769 RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
770 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
771 try {
772
773 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
774 for (int i = 0; i < 5; ++i) {
775 tasks[i] = new TrackedNoOpRunnable();
776 }
777 TrackedLongRunnable mr = new TrackedLongRunnable();
778 p.execute(mr);
779 for (int i = 0; i < 5; ++i) {
780 p.execute(tasks[i]);
781 }
782 for (int i = 1; i < 5; ++i) {
783 assertTrue(tasks[i].done);
784 }
785 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
786 } catch (RejectedExecutionException ex) {
787 unexpectedException();
788 } finally {
789 joinPool(p);
790 }
791 }
792
793 /**
794 * executor using DiscardPolicy drops task if saturated.
795 */
796 public void testSaturatedExecute3() {
797 RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
798 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
799 try {
800
801 TrackedNoOpRunnable[] tasks = new TrackedNoOpRunnable[5];
802 for (int i = 0; i < 5; ++i) {
803 tasks[i] = new TrackedNoOpRunnable();
804 }
805 p.execute(new TrackedLongRunnable());
806 for (int i = 0; i < 5; ++i) {
807 p.execute(tasks[i]);
808 }
809 for (int i = 0; i < 5; ++i) {
810 assertFalse(tasks[i].done);
811 }
812 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
813 } catch (RejectedExecutionException ex) {
814 unexpectedException();
815 } finally {
816 joinPool(p);
817 }
818 }
819
820 /**
821 * executor using DiscardOldestPolicy drops oldest task if saturated.
822 */
823 public void testSaturatedExecute4() {
824 RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
825 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
826 try {
827 p.execute(new TrackedLongRunnable());
828 TrackedLongRunnable r2 = new TrackedLongRunnable();
829 p.execute(r2);
830 assertTrue(p.getQueue().contains(r2));
831 TrackedNoOpRunnable r3 = new TrackedNoOpRunnable();
832 p.execute(r3);
833 assertFalse(p.getQueue().contains(r2));
834 assertTrue(p.getQueue().contains(r3));
835 try { p.shutdownNow(); } catch (SecurityException ok) { return; }
836 } catch (RejectedExecutionException ex) {
837 unexpectedException();
838 } finally {
839 joinPool(p);
840 }
841 }
842
843 /**
844 * execute throws RejectedExecutionException if shutdown
845 */
846 public void testRejectedExecutionExceptionOnShutdown() {
847 ThreadPoolExecutor tpe =
848 new ThreadPoolExecutor(1,1,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(1));
849 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
850 try {
851 tpe.execute(new NoOpRunnable());
852 shouldThrow();
853 } catch (RejectedExecutionException success) {}
854
855 joinPool(tpe);
856 }
857
858 /**
859 * execute using CallerRunsPolicy drops task on shutdown
860 */
861 public void testCallerRunsOnShutdown() {
862 RejectedExecutionHandler h = new ThreadPoolExecutor.CallerRunsPolicy();
863 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
864
865 try { p.shutdown(); } catch (SecurityException ok) { return; }
866 try {
867 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
868 p.execute(r);
869 assertFalse(r.done);
870 } catch (RejectedExecutionException success) {
871 unexpectedException();
872 } finally {
873 joinPool(p);
874 }
875 }
876
877 /**
878 * execute using DiscardPolicy drops task on shutdown
879 */
880 public void testDiscardOnShutdown() {
881 RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardPolicy();
882 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
883
884 try { p.shutdown(); } catch (SecurityException ok) { return; }
885 try {
886 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
887 p.execute(r);
888 assertFalse(r.done);
889 } catch (RejectedExecutionException success) {
890 unexpectedException();
891 } finally {
892 joinPool(p);
893 }
894 }
895
896
897 /**
898 * execute using DiscardOldestPolicy drops task on shutdown
899 */
900 public void testDiscardOldestOnShutdown() {
901 RejectedExecutionHandler h = new ThreadPoolExecutor.DiscardOldestPolicy();
902 ThreadPoolExecutor p = new ThreadPoolExecutor(1,1, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(1), h);
903
904 try { p.shutdown(); } catch (SecurityException ok) { return; }
905 try {
906 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
907 p.execute(r);
908 assertFalse(r.done);
909 } catch (RejectedExecutionException success) {
910 unexpectedException();
911 } finally {
912 joinPool(p);
913 }
914 }
915
916
917 /**
918 * execute (null) throws NPE
919 */
920 public void testExecuteNull() {
921 ThreadPoolExecutor tpe = null;
922 try {
923 tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
924 tpe.execute(null);
925 shouldThrow();
926 } catch (NullPointerException success) {}
927
928 joinPool(tpe);
929 }
930
931 /**
932 * setCorePoolSize of negative value throws IllegalArgumentException
933 */
934 public void testCorePoolSizeIllegalArgumentException() {
935 ThreadPoolExecutor tpe = null;
936 try {
937 tpe = new ThreadPoolExecutor(1,2,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
938 } catch (Exception e) {}
939 try {
940 tpe.setCorePoolSize(-1);
941 shouldThrow();
942 } catch (IllegalArgumentException success) {
943 } finally {
944 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
945 }
946 joinPool(tpe);
947 }
948
949 /**
950 * setMaximumPoolSize(int) throws IllegalArgumentException if
951 * given a value less the core pool size
952 */
953 public void testMaximumPoolSizeIllegalArgumentException() {
954 ThreadPoolExecutor tpe = null;
955 try {
956 tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
957 } catch (Exception e) {}
958 try {
959 tpe.setMaximumPoolSize(1);
960 shouldThrow();
961 } catch (IllegalArgumentException success) {
962 } finally {
963 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
964 }
965 joinPool(tpe);
966 }
967
968 /**
969 * setMaximumPoolSize throws IllegalArgumentException
970 * if given a negative value
971 */
972 public void testMaximumPoolSizeIllegalArgumentException2() {
973 ThreadPoolExecutor tpe = null;
974 try {
975 tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
976 } catch (Exception e) {}
977 try {
978 tpe.setMaximumPoolSize(-1);
979 shouldThrow();
980 } catch (IllegalArgumentException success) {
981 } finally {
982 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
983 }
984 joinPool(tpe);
985 }
986
987
988 /**
989 * setKeepAliveTime throws IllegalArgumentException
990 * when given a negative value
991 */
992 public void testKeepAliveTimeIllegalArgumentException() {
993 ThreadPoolExecutor tpe = null;
994 try {
995 tpe = new ThreadPoolExecutor(2,3,LONG_DELAY_MS, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(10));
996 } catch (Exception e) {}
997
998 try {
999 tpe.setKeepAliveTime(-1,TimeUnit.MILLISECONDS);
1000 shouldThrow();
1001 } catch (IllegalArgumentException success) {
1002 } finally {
1003 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1004 }
1005 joinPool(tpe);
1006 }
1007
1008 /**
1009 * terminated() is called on termination
1010 */
1011 public void testTerminated() {
1012 ExtendedTPE tpe = new ExtendedTPE();
1013 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1014 assertTrue(tpe.terminatedCalled);
1015 joinPool(tpe);
1016 }
1017
1018 /**
1019 * beforeExecute and afterExecute are called when executing task
1020 */
1021 public void testBeforeAfter() {
1022 ExtendedTPE tpe = new ExtendedTPE();
1023 try {
1024 TrackedNoOpRunnable r = new TrackedNoOpRunnable();
1025 tpe.execute(r);
1026 Thread.sleep(SHORT_DELAY_MS);
1027 assertTrue(r.done);
1028 assertTrue(tpe.beforeCalled);
1029 assertTrue(tpe.afterCalled);
1030 try { tpe.shutdown(); } catch (SecurityException ok) { return; }
1031 }
1032 catch (Exception ex) {
1033 unexpectedException();
1034 } finally {
1035 joinPool(tpe);
1036 }
1037 }
1038
1039 /**
1040 * completed submit of callable returns result
1041 */
1042 public void testSubmitCallable() {
1043 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1044 try {
1045 Future<String> future = e.submit(new StringTask());
1046 String result = future.get();
1047 assertSame(TEST_STRING, result);
1048 }
1049 catch (ExecutionException ex) {
1050 unexpectedException();
1051 }
1052 catch (InterruptedException ex) {
1053 unexpectedException();
1054 } finally {
1055 joinPool(e);
1056 }
1057 }
1058
1059 /**
1060 * completed submit of runnable returns successfully
1061 */
1062 public void testSubmitRunnable() {
1063 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1064 try {
1065 Future<?> future = e.submit(new NoOpRunnable());
1066 future.get();
1067 assertTrue(future.isDone());
1068 }
1069 catch (ExecutionException ex) {
1070 unexpectedException();
1071 }
1072 catch (InterruptedException ex) {
1073 unexpectedException();
1074 } finally {
1075 joinPool(e);
1076 }
1077 }
1078
1079 /**
1080 * completed submit of (runnable, result) returns result
1081 */
1082 public void testSubmitRunnable2() {
1083 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1084 try {
1085 Future<String> future = e.submit(new NoOpRunnable(), TEST_STRING);
1086 String result = future.get();
1087 assertSame(TEST_STRING, result);
1088 }
1089 catch (ExecutionException ex) {
1090 unexpectedException();
1091 }
1092 catch (InterruptedException ex) {
1093 unexpectedException();
1094 } finally {
1095 joinPool(e);
1096 }
1097 }
1098
1099
1100
1101
1102
1103 /**
1104 * invokeAny(null) throws NPE
1105 */
1106 public void testInvokeAny1() {
1107 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1108 try {
1109 e.invokeAny(null);
1110 } catch (NullPointerException success) {
1111 } catch (Exception ex) {
1112 unexpectedException();
1113 } finally {
1114 joinPool(e);
1115 }
1116 }
1117
1118 /**
1119 * invokeAny(empty collection) throws IAE
1120 */
1121 public void testInvokeAny2() {
1122 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1123 try {
1124 e.invokeAny(new ArrayList<Callable<String>>());
1125 } catch (IllegalArgumentException success) {
1126 } catch (Exception ex) {
1127 unexpectedException();
1128 } finally {
1129 joinPool(e);
1130 }
1131 }
1132
1133 /**
1134 * invokeAny(c) throws NPE if c has null elements
1135 */
1136 public void testInvokeAny3() {
1137 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1138 try {
1139 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1140 l.add(new StringTask());
1141 l.add(null);
1142 e.invokeAny(l);
1143 } catch (NullPointerException success) {
1144 } catch (Exception ex) {
1145 unexpectedException();
1146 } finally {
1147 joinPool(e);
1148 }
1149 }
1150
1151 /**
1152 * invokeAny(c) throws ExecutionException if no task completes
1153 */
1154 public void testInvokeAny4() {
1155 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1156 try {
1157 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1158 l.add(new NPETask());
1159 e.invokeAny(l);
1160 } catch (ExecutionException success) {
1161 } catch (Exception ex) {
1162 unexpectedException();
1163 } finally {
1164 joinPool(e);
1165 }
1166 }
1167
1168 /**
1169 * invokeAny(c) returns result of some task
1170 */
1171 public void testInvokeAny5() {
1172 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1173 try {
1174 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1175 l.add(new StringTask());
1176 l.add(new StringTask());
1177 String result = e.invokeAny(l);
1178 assertSame(TEST_STRING, result);
1179 } catch (ExecutionException success) {
1180 } catch (Exception ex) {
1181 unexpectedException();
1182 } finally {
1183 joinPool(e);
1184 }
1185 }
1186
1187 /**
1188 * invokeAll(null) throws NPE
1189 */
1190 public void testInvokeAll1() {
1191 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1192 try {
1193 e.invokeAll(null);
1194 } catch (NullPointerException success) {
1195 } catch (Exception ex) {
1196 unexpectedException();
1197 } finally {
1198 joinPool(e);
1199 }
1200 }
1201
1202 /**
1203 * invokeAll(empty collection) returns empty collection
1204 */
1205 public void testInvokeAll2() {
1206 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1207 try {
1208 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>());
1209 assertTrue(r.isEmpty());
1210 } catch (Exception ex) {
1211 unexpectedException();
1212 } finally {
1213 joinPool(e);
1214 }
1215 }
1216
1217 /**
1218 * invokeAll(c) throws NPE if c has null elements
1219 */
1220 public void testInvokeAll3() {
1221 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1222 try {
1223 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1224 l.add(new StringTask());
1225 l.add(null);
1226 e.invokeAll(l);
1227 } catch (NullPointerException success) {
1228 } catch (Exception ex) {
1229 unexpectedException();
1230 } finally {
1231 joinPool(e);
1232 }
1233 }
1234
1235 /**
1236 * get of element of invokeAll(c) throws exception on failed task
1237 */
1238 public void testInvokeAll4() {
1239 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1240 try {
1241 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1242 l.add(new NPETask());
1243 List<Future<String>> result = e.invokeAll(l);
1244 assertEquals(1, result.size());
1245 for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1246 it.next().get();
1247 } catch (ExecutionException success) {
1248 } catch (Exception ex) {
1249 unexpectedException();
1250 } finally {
1251 joinPool(e);
1252 }
1253 }
1254
1255 /**
1256 * invokeAll(c) returns results of all completed tasks
1257 */
1258 public void testInvokeAll5() {
1259 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1260 try {
1261 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1262 l.add(new StringTask());
1263 l.add(new StringTask());
1264 List<Future<String>> result = e.invokeAll(l);
1265 assertEquals(2, result.size());
1266 for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1267 assertSame(TEST_STRING, it.next().get());
1268 } catch (ExecutionException success) {
1269 } catch (Exception ex) {
1270 unexpectedException();
1271 } finally {
1272 joinPool(e);
1273 }
1274 }
1275
1276
1277
1278 /**
1279 * timed invokeAny(null) throws NPE
1280 */
1281 public void testTimedInvokeAny1() {
1282 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1283 try {
1284 e.invokeAny(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1285 } catch (NullPointerException success) {
1286 } catch (Exception ex) {
1287 unexpectedException();
1288 } finally {
1289 joinPool(e);
1290 }
1291 }
1292
1293 /**
1294 * timed invokeAny(,,null) throws NPE
1295 */
1296 public void testTimedInvokeAnyNullTimeUnit() {
1297 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1298 try {
1299 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1300 l.add(new StringTask());
1301 e.invokeAny(l, MEDIUM_DELAY_MS, null);
1302 } catch (NullPointerException success) {
1303 } catch (Exception ex) {
1304 unexpectedException();
1305 } finally {
1306 joinPool(e);
1307 }
1308 }
1309
1310 /**
1311 * timed invokeAny(empty collection) throws IAE
1312 */
1313 public void testTimedInvokeAny2() {
1314 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1315 try {
1316 e.invokeAny(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1317 } catch (IllegalArgumentException success) {
1318 } catch (Exception ex) {
1319 unexpectedException();
1320 } finally {
1321 joinPool(e);
1322 }
1323 }
1324
1325 /**
1326 * timed invokeAny(c) throws NPE if c has null elements
1327 */
1328 public void testTimedInvokeAny3() {
1329 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1330 try {
1331 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1332 l.add(new StringTask());
1333 l.add(null);
1334 e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1335 } catch (NullPointerException success) {
1336 } catch (Exception ex) {
1337 ex.printStackTrace();
1338 unexpectedException();
1339 } finally {
1340 joinPool(e);
1341 }
1342 }
1343
1344 /**
1345 * timed invokeAny(c) throws ExecutionException if no task completes
1346 */
1347 public void testTimedInvokeAny4() {
1348 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1349 try {
1350 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1351 l.add(new NPETask());
1352 e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1353 } catch (ExecutionException success) {
1354 } catch (Exception ex) {
1355 unexpectedException();
1356 } finally {
1357 joinPool(e);
1358 }
1359 }
1360
1361 /**
1362 * timed invokeAny(c) returns result of some task
1363 */
1364 public void testTimedInvokeAny5() {
1365 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1366 try {
1367 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1368 l.add(new StringTask());
1369 l.add(new StringTask());
1370 String result = e.invokeAny(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1371 assertSame(TEST_STRING, result);
1372 } catch (ExecutionException success) {
1373 } catch (Exception ex) {
1374 unexpectedException();
1375 } finally {
1376 joinPool(e);
1377 }
1378 }
1379
1380 /**
1381 * timed invokeAll(null) throws NPE
1382 */
1383 public void testTimedInvokeAll1() {
1384 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1385 try {
1386 e.invokeAll(null, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1387 } catch (NullPointerException success) {
1388 } catch (Exception ex) {
1389 unexpectedException();
1390 } finally {
1391 joinPool(e);
1392 }
1393 }
1394
1395 /**
1396 * timed invokeAll(,,null) throws NPE
1397 */
1398 public void testTimedInvokeAllNullTimeUnit() {
1399 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1400 try {
1401 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1402 l.add(new StringTask());
1403 e.invokeAll(l, MEDIUM_DELAY_MS, null);
1404 } catch (NullPointerException success) {
1405 } catch (Exception ex) {
1406 unexpectedException();
1407 } finally {
1408 joinPool(e);
1409 }
1410 }
1411
1412 /**
1413 * timed invokeAll(empty collection) returns empty collection
1414 */
1415 public void testTimedInvokeAll2() {
1416 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1417 try {
1418 List<Future<String>> r = e.invokeAll(new ArrayList<Callable<String>>(), MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1419 assertTrue(r.isEmpty());
1420 } catch (Exception ex) {
1421 unexpectedException();
1422 } finally {
1423 joinPool(e);
1424 }
1425 }
1426
1427 /**
1428 * timed invokeAll(c) throws NPE if c has null elements
1429 */
1430 public void testTimedInvokeAll3() {
1431 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1432 try {
1433 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1434 l.add(new StringTask());
1435 l.add(null);
1436 e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1437 } catch (NullPointerException success) {
1438 } catch (Exception ex) {
1439 unexpectedException();
1440 } finally {
1441 joinPool(e);
1442 }
1443 }
1444
1445 /**
1446 * get of element of invokeAll(c) throws exception on failed task
1447 */
1448 public void testTimedInvokeAll4() {
1449 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1450 try {
1451 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1452 l.add(new NPETask());
1453 List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1454 assertEquals(1, result.size());
1455 for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1456 it.next().get();
1457 } catch (ExecutionException success) {
1458 } catch (Exception ex) {
1459 unexpectedException();
1460 } finally {
1461 joinPool(e);
1462 }
1463 }
1464
1465 /**
1466 * timed invokeAll(c) returns results of all completed tasks
1467 */
1468 public void testTimedInvokeAll5() {
1469 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1470 try {
1471 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1472 l.add(new StringTask());
1473 l.add(new StringTask());
1474 List<Future<String>> result = e.invokeAll(l, MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
1475 assertEquals(2, result.size());
1476 for (Iterator<Future<String>> it = result.iterator(); it.hasNext();)
1477 assertSame(TEST_STRING, it.next().get());
1478 } catch (ExecutionException success) {
1479 } catch (Exception ex) {
1480 unexpectedException();
1481 } finally {
1482 joinPool(e);
1483 }
1484 }
1485
1486 /**
1487 * timed invokeAll(c) cancels tasks not completed by timeout
1488 */
1489 public void testTimedInvokeAll6() {
1490 ExecutorService e = new ThreadPoolExecutor(2, 2, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1491 try {
1492 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1493 l.add(new StringTask());
1494 l.add(Executors.callable(new MediumPossiblyInterruptedRunnable(), TEST_STRING));
1495 l.add(new StringTask());
1496 List<Future<String>> result = e.invokeAll(l, SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
1497 assertEquals(3, result.size());
1498 Iterator<Future<String>> it = result.iterator();
1499 Future<String> f1 = it.next();
1500 Future<String> f2 = it.next();
1501 Future<String> f3 = it.next();
1502 assertTrue(f1.isDone());
1503 assertTrue(f2.isDone());
1504 assertTrue(f3.isDone());
1505 assertFalse(f1.isCancelled());
1506 assertTrue(f2.isCancelled());
1507 } catch (Exception ex) {
1508 unexpectedException();
1509 } finally {
1510 joinPool(e);
1511 }
1512 }
1513
1514 /**
1515 * Execution continues if there is at least one thread even if
1516 * thread factory fails to create more
1517 */
1518 public void testFailingThreadFactory() {
1519 ExecutorService e = new ThreadPoolExecutor(100, 100, LONG_DELAY_MS, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new FailingThreadFactory());
1520 try {
1521 ArrayList<Callable<String>> l = new ArrayList<Callable<String>>();
1522 for (int k = 0; k < 100; ++k) {
1523 e.execute(new NoOpRunnable());
1524 }
1525 Thread.sleep(LONG_DELAY_MS);
1526 } catch (Exception ex) {
1527 unexpectedException();
1528 } finally {
1529 joinPool(e);
1530 }
1531 }
1532
1533 /**
1534 * allowsCoreThreadTimeOut is by default false.
1535 */
1536 public void testAllowsCoreThreadTimeOut() {
1537 ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1538 assertFalse(tpe.allowsCoreThreadTimeOut());
1539 joinPool(tpe);
1540 }
1541
1542 /**
1543 * allowCoreThreadTimeOut(true) causes idle threads to time out
1544 */
1545 public void testAllowCoreThreadTimeOut_true() {
1546 ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1547 tpe.allowCoreThreadTimeOut(true);
1548 tpe.execute(new NoOpRunnable());
1549 try {
1550 Thread.sleep(MEDIUM_DELAY_MS);
1551 assertEquals(0, tpe.getPoolSize());
1552 } catch (InterruptedException e) {
1553 unexpectedException();
1554 } finally {
1555 joinPool(tpe);
1556 }
1557 }
1558
1559 /**
1560 * allowCoreThreadTimeOut(false) causes idle threads not to time out
1561 */
1562 public void testAllowCoreThreadTimeOut_false() {
1563 ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 10, 10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10));
1564 tpe.allowCoreThreadTimeOut(false);
1565 tpe.execute(new NoOpRunnable());
1566 try {
1567 Thread.sleep(MEDIUM_DELAY_MS);
1568 assertTrue(tpe.getPoolSize() >= 1);
1569 } catch (InterruptedException e) {
1570 unexpectedException();
1571 } finally {
1572 joinPool(tpe);
1573 }
1574 }
1575
1576 /**
1577 * execute allows the same task to be submitted multiple times, even
1578 * if rejected
1579 */
1580 public void testRejectedRecycledTask() {
1581 final int nTasks = 1000;
1582 final AtomicInteger nRun = new AtomicInteger(0);
1583 final Runnable recycledTask = new Runnable() {
1584 public void run() {
1585 nRun.getAndIncrement();
1586 } };
1587 final ThreadPoolExecutor p =
1588 new ThreadPoolExecutor(1, 30, 60, TimeUnit.SECONDS,
1589 new ArrayBlockingQueue(30));
1590 try {
1591 for (int i = 0; i < nTasks; ++i) {
1592 for (;;) {
1593 try {
1594 p.execute(recycledTask);
1595 break;
1596 }
1597 catch (RejectedExecutionException ignore) {
1598 }
1599 }
1600 }
1601 Thread.sleep(5000); // enough time to run all tasks
1602 assertEquals(nRun.get(), nTasks);
1603 } catch (Exception ex) {
1604 ex.printStackTrace();
1605 unexpectedException();
1606 } finally {
1607 p.shutdown();
1608 }
1609 }
1610
1611 }