ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPool8Test.java
Revision: 1.12
Committed: Mon Jul 22 15:55:43 2013 UTC (10 years, 9 months ago) by jsr166
Branch: MAIN
Changes since 1.11: +5 -6 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/publicdomain/zero/1.0/
5 */
6
7 import junit.framework.*;
8 import java.util.concurrent.CancellationException;
9 import java.util.concurrent.ExecutionException;
10 import java.util.concurrent.ForkJoinPool;
11 import java.util.concurrent.ForkJoinTask;
12 import java.util.concurrent.ForkJoinWorkerThread;
13 import java.util.concurrent.RecursiveAction;
14 import java.util.concurrent.CountedCompleter;
15 import java.util.concurrent.ThreadLocalRandom;
16 import java.util.concurrent.TimeUnit;
17 import java.util.concurrent.TimeoutException;
18 import static java.util.concurrent.TimeUnit.SECONDS;
19 import static java.util.concurrent.TimeUnit.MILLISECONDS;
20 import java.util.Arrays;
21 import java.util.HashSet;
22
23 public class ForkJoinPool8Test extends JSR166TestCase {
24 public static void main(String[] args) {
25 junit.textui.TestRunner.run(suite());
26 }
27
28 public static Test suite() {
29 return new TestSuite(ForkJoinPool8Test.class);
30 }
31
32 /**
33 * Common pool exists and has expected parallelism.
34 */
35 public void testCommonPoolParallelism() {
36 assertEquals(ForkJoinPool.getCommonPoolParallelism(),
37 ForkJoinPool.commonPool().getParallelism());
38 }
39
40 /**
41 * Common pool cannot be shut down
42 */
43 public void testCommonPoolShutDown() {
44 assertFalse(ForkJoinPool.commonPool().isShutdown());
45 assertFalse(ForkJoinPool.commonPool().isTerminating());
46 assertFalse(ForkJoinPool.commonPool().isTerminated());
47 ForkJoinPool.commonPool().shutdown();
48 assertFalse(ForkJoinPool.commonPool().isShutdown());
49 assertFalse(ForkJoinPool.commonPool().isTerminating());
50 assertFalse(ForkJoinPool.commonPool().isTerminated());
51 ForkJoinPool.commonPool().shutdownNow();
52 assertFalse(ForkJoinPool.commonPool().isShutdown());
53 assertFalse(ForkJoinPool.commonPool().isTerminating());
54 assertFalse(ForkJoinPool.commonPool().isTerminated());
55 }
56
57 /*
58 * All of the following test methods are adaptations of those for
59 * RecursiveAction and CountedCompleter, but with all actions
60 * executed in the common pool, generally implicitly via
61 * checkInvoke.
62 */
63
64 private void checkInvoke(ForkJoinTask a) {
65 checkNotDone(a);
66 assertNull(a.invoke());
67 checkCompletedNormally(a);
68 }
69
70 void checkNotDone(ForkJoinTask a) {
71 assertFalse(a.isDone());
72 assertFalse(a.isCompletedNormally());
73 assertFalse(a.isCompletedAbnormally());
74 assertFalse(a.isCancelled());
75 assertNull(a.getException());
76 assertNull(a.getRawResult());
77
78 if (! ForkJoinTask.inForkJoinPool()) {
79 Thread.currentThread().interrupt();
80 try {
81 a.get();
82 shouldThrow();
83 } catch (InterruptedException success) {
84 } catch (Throwable fail) { threadUnexpectedException(fail); }
85
86 Thread.currentThread().interrupt();
87 try {
88 a.get(5L, SECONDS);
89 shouldThrow();
90 } catch (InterruptedException success) {
91 } catch (Throwable fail) { threadUnexpectedException(fail); }
92 }
93
94 try {
95 a.get(0L, SECONDS);
96 shouldThrow();
97 } catch (TimeoutException success) {
98 } catch (Throwable fail) { threadUnexpectedException(fail); }
99 }
100
101 void checkCompletedNormally(ForkJoinTask a) {
102 assertTrue(a.isDone());
103 assertFalse(a.isCancelled());
104 assertTrue(a.isCompletedNormally());
105 assertFalse(a.isCompletedAbnormally());
106 assertNull(a.getException());
107 assertNull(a.getRawResult());
108 assertNull(a.join());
109 assertFalse(a.cancel(false));
110 assertFalse(a.cancel(true));
111 try {
112 assertNull(a.get());
113 } catch (Throwable fail) { threadUnexpectedException(fail); }
114 try {
115 assertNull(a.get(5L, SECONDS));
116 } catch (Throwable fail) { threadUnexpectedException(fail); }
117 }
118
119 void checkCancelled(ForkJoinTask a) {
120 assertTrue(a.isDone());
121 assertTrue(a.isCancelled());
122 assertFalse(a.isCompletedNormally());
123 assertTrue(a.isCompletedAbnormally());
124 assertTrue(a.getException() instanceof CancellationException);
125 assertNull(a.getRawResult());
126
127 try {
128 a.join();
129 shouldThrow();
130 } catch (CancellationException success) {
131 } catch (Throwable fail) { threadUnexpectedException(fail); }
132
133 try {
134 a.get();
135 shouldThrow();
136 } catch (CancellationException success) {
137 } catch (Throwable fail) { threadUnexpectedException(fail); }
138
139 try {
140 a.get(5L, SECONDS);
141 shouldThrow();
142 } catch (CancellationException success) {
143 } catch (Throwable fail) { threadUnexpectedException(fail); }
144 }
145
146 void checkCompletedAbnormally(ForkJoinTask a, Throwable t) {
147 assertTrue(a.isDone());
148 assertFalse(a.isCancelled());
149 assertFalse(a.isCompletedNormally());
150 assertTrue(a.isCompletedAbnormally());
151 assertSame(t.getClass(), a.getException().getClass());
152 assertNull(a.getRawResult());
153 assertFalse(a.cancel(false));
154 assertFalse(a.cancel(true));
155
156 try {
157 a.join();
158 shouldThrow();
159 } catch (Throwable expected) {
160 assertSame(expected.getClass(), t.getClass());
161 }
162
163 try {
164 a.get();
165 shouldThrow();
166 } catch (ExecutionException success) {
167 assertSame(t.getClass(), success.getCause().getClass());
168 } catch (Throwable fail) { threadUnexpectedException(fail); }
169
170 try {
171 a.get(5L, SECONDS);
172 shouldThrow();
173 } catch (ExecutionException success) {
174 assertSame(t.getClass(), success.getCause().getClass());
175 } catch (Throwable fail) { threadUnexpectedException(fail); }
176 }
177
178 public static final class FJException extends RuntimeException {
179 public FJException() { super(); }
180 public FJException(Throwable cause) { super(cause); }
181 }
182
183 // A simple recursive action for testing
184 final class FibAction extends CheckedRecursiveAction {
185 final int number;
186 int result;
187 FibAction(int n) { number = n; }
188 protected void realCompute() {
189 int n = number;
190 if (n <= 1)
191 result = n;
192 else {
193 FibAction f1 = new FibAction(n - 1);
194 FibAction f2 = new FibAction(n - 2);
195 invokeAll(f1, f2);
196 result = f1.result + f2.result;
197 }
198 }
199 }
200
201 // A recursive action failing in base case
202 static final class FailingFibAction extends RecursiveAction {
203 final int number;
204 int result;
205 FailingFibAction(int n) { number = n; }
206 public void compute() {
207 int n = number;
208 if (n <= 1)
209 throw new FJException();
210 else {
211 FailingFibAction f1 = new FailingFibAction(n - 1);
212 FailingFibAction f2 = new FailingFibAction(n - 2);
213 invokeAll(f1, f2);
214 result = f1.result + f2.result;
215 }
216 }
217 }
218
219 /**
220 * invoke returns when task completes normally.
221 * isCompletedAbnormally and isCancelled return false for normally
222 * completed tasks. getRawResult of a RecursiveAction returns null;
223 */
224 public void testInvoke() {
225 RecursiveAction a = new CheckedRecursiveAction() {
226 protected void realCompute() {
227 FibAction f = new FibAction(8);
228 assertNull(f.invoke());
229 assertEquals(21, f.result);
230 checkCompletedNormally(f);
231 }};
232 checkInvoke(a);
233 }
234
235 /**
236 * quietlyInvoke task returns when task completes normally.
237 * isCompletedAbnormally and isCancelled return false for normally
238 * completed tasks
239 */
240 public void testQuietlyInvoke() {
241 RecursiveAction a = new CheckedRecursiveAction() {
242 protected void realCompute() {
243 FibAction f = new FibAction(8);
244 f.quietlyInvoke();
245 assertEquals(21, f.result);
246 checkCompletedNormally(f);
247 }};
248 checkInvoke(a);
249 }
250
251 /**
252 * join of a forked task returns when task completes
253 */
254 public void testForkJoin() {
255 RecursiveAction a = new CheckedRecursiveAction() {
256 protected void realCompute() {
257 FibAction f = new FibAction(8);
258 assertSame(f, f.fork());
259 assertNull(f.join());
260 assertEquals(21, f.result);
261 checkCompletedNormally(f);
262 }};
263 checkInvoke(a);
264 }
265
266 /**
267 * join/quietlyJoin of a forked task succeeds in the presence of interrupts
268 */
269 public void testJoinIgnoresInterrupts() {
270 RecursiveAction a = new CheckedRecursiveAction() {
271 protected void realCompute() {
272 FibAction f = new FibAction(8);
273 final Thread myself = Thread.currentThread();
274
275 // test join()
276 assertSame(f, f.fork());
277 myself.interrupt();
278 assertTrue(myself.isInterrupted());
279 assertNull(f.join());
280 Thread.interrupted();
281 assertEquals(21, f.result);
282 checkCompletedNormally(f);
283
284 f = new FibAction(8);
285 f.cancel(true);
286 assertSame(f, f.fork());
287 myself.interrupt();
288 assertTrue(myself.isInterrupted());
289 try {
290 f.join();
291 shouldThrow();
292 } catch (CancellationException success) {
293 Thread.interrupted();
294 checkCancelled(f);
295 }
296
297 f = new FibAction(8);
298 f.completeExceptionally(new FJException());
299 assertSame(f, f.fork());
300 myself.interrupt();
301 assertTrue(myself.isInterrupted());
302 try {
303 f.join();
304 shouldThrow();
305 } catch (FJException success) {
306 Thread.interrupted();
307 checkCompletedAbnormally(f, success);
308 }
309
310 // test quietlyJoin()
311 f = new FibAction(8);
312 assertSame(f, f.fork());
313 myself.interrupt();
314 assertTrue(myself.isInterrupted());
315 f.quietlyJoin();
316 Thread.interrupted();
317 assertEquals(21, f.result);
318 checkCompletedNormally(f);
319
320 f = new FibAction(8);
321 f.cancel(true);
322 assertSame(f, f.fork());
323 myself.interrupt();
324 assertTrue(myself.isInterrupted());
325 f.quietlyJoin();
326 Thread.interrupted();
327 checkCancelled(f);
328
329 f = new FibAction(8);
330 f.completeExceptionally(new FJException());
331 assertSame(f, f.fork());
332 myself.interrupt();
333 assertTrue(myself.isInterrupted());
334 f.quietlyJoin();
335 Thread.interrupted();
336 checkCompletedAbnormally(f, f.getException());
337 }};
338 checkInvoke(a);
339 a.reinitialize();
340 checkInvoke(a);
341 }
342
343 /**
344 * get of a forked task returns when task completes
345 */
346 public void testForkGet() {
347 RecursiveAction a = new CheckedRecursiveAction() {
348 protected void realCompute() throws Exception {
349 FibAction f = new FibAction(8);
350 assertSame(f, f.fork());
351 assertNull(f.get());
352 assertEquals(21, f.result);
353 checkCompletedNormally(f);
354 }};
355 checkInvoke(a);
356 }
357
358 /**
359 * timed get of a forked task returns when task completes
360 */
361 public void testForkTimedGet() {
362 RecursiveAction a = new CheckedRecursiveAction() {
363 protected void realCompute() throws Exception {
364 FibAction f = new FibAction(8);
365 assertSame(f, f.fork());
366 assertNull(f.get(5L, SECONDS));
367 assertEquals(21, f.result);
368 checkCompletedNormally(f);
369 }};
370 checkInvoke(a);
371 }
372
373 /**
374 * timed get with null time unit throws NPE
375 */
376 public void testForkTimedGetNPE() {
377 RecursiveAction a = new CheckedRecursiveAction() {
378 protected void realCompute() throws Exception {
379 FibAction f = new FibAction(8);
380 assertSame(f, f.fork());
381 try {
382 f.get(5L, null);
383 shouldThrow();
384 } catch (NullPointerException success) {}
385 }};
386 checkInvoke(a);
387 }
388
389 /**
390 * quietlyJoin of a forked task returns when task completes
391 */
392 public void testForkQuietlyJoin() {
393 RecursiveAction a = new CheckedRecursiveAction() {
394 protected void realCompute() {
395 FibAction f = new FibAction(8);
396 assertSame(f, f.fork());
397 f.quietlyJoin();
398 assertEquals(21, f.result);
399 checkCompletedNormally(f);
400 }};
401 checkInvoke(a);
402 }
403
404 /**
405 * invoke task throws exception when task completes abnormally
406 */
407 public void testAbnormalInvoke() {
408 RecursiveAction a = new CheckedRecursiveAction() {
409 protected void realCompute() {
410 FailingFibAction f = new FailingFibAction(8);
411 try {
412 f.invoke();
413 shouldThrow();
414 } catch (FJException success) {
415 checkCompletedAbnormally(f, success);
416 }
417 }};
418 checkInvoke(a);
419 }
420
421 /**
422 * quietlyInvoke task returns when task completes abnormally
423 */
424 public void testAbnormalQuietlyInvoke() {
425 RecursiveAction a = new CheckedRecursiveAction() {
426 protected void realCompute() {
427 FailingFibAction f = new FailingFibAction(8);
428 f.quietlyInvoke();
429 assertTrue(f.getException() instanceof FJException);
430 checkCompletedAbnormally(f, f.getException());
431 }};
432 checkInvoke(a);
433 }
434
435 /**
436 * join of a forked task throws exception when task completes abnormally
437 */
438 public void testAbnormalForkJoin() {
439 RecursiveAction a = new CheckedRecursiveAction() {
440 protected void realCompute() {
441 FailingFibAction f = new FailingFibAction(8);
442 assertSame(f, f.fork());
443 try {
444 f.join();
445 shouldThrow();
446 } catch (FJException success) {
447 checkCompletedAbnormally(f, success);
448 }
449 }};
450 checkInvoke(a);
451 }
452
453 /**
454 * get of a forked task throws exception when task completes abnormally
455 */
456 public void testAbnormalForkGet() {
457 RecursiveAction a = new CheckedRecursiveAction() {
458 protected void realCompute() throws Exception {
459 FailingFibAction f = new FailingFibAction(8);
460 assertSame(f, f.fork());
461 try {
462 f.get();
463 shouldThrow();
464 } catch (ExecutionException success) {
465 Throwable cause = success.getCause();
466 assertTrue(cause instanceof FJException);
467 checkCompletedAbnormally(f, cause);
468 }
469 }};
470 checkInvoke(a);
471 }
472
473 /**
474 * timed get of a forked task throws exception when task completes abnormally
475 */
476 public void testAbnormalForkTimedGet() {
477 RecursiveAction a = new CheckedRecursiveAction() {
478 protected void realCompute() throws Exception {
479 FailingFibAction f = new FailingFibAction(8);
480 assertSame(f, f.fork());
481 try {
482 f.get(5L, TimeUnit.SECONDS);
483 shouldThrow();
484 } catch (ExecutionException success) {
485 Throwable cause = success.getCause();
486 assertTrue(cause instanceof FJException);
487 checkCompletedAbnormally(f, cause);
488 }
489 }};
490 checkInvoke(a);
491 }
492
493 /**
494 * quietlyJoin of a forked task returns when task completes abnormally
495 */
496 public void testAbnormalForkQuietlyJoin() {
497 RecursiveAction a = new CheckedRecursiveAction() {
498 protected void realCompute() {
499 FailingFibAction f = new FailingFibAction(8);
500 assertSame(f, f.fork());
501 f.quietlyJoin();
502 assertTrue(f.getException() instanceof FJException);
503 checkCompletedAbnormally(f, f.getException());
504 }};
505 checkInvoke(a);
506 }
507
508 /**
509 * invoke task throws exception when task cancelled
510 */
511 public void testCancelledInvoke() {
512 RecursiveAction a = new CheckedRecursiveAction() {
513 protected void realCompute() {
514 FibAction f = new FibAction(8);
515 assertTrue(f.cancel(true));
516 try {
517 f.invoke();
518 shouldThrow();
519 } catch (CancellationException success) {
520 checkCancelled(f);
521 }
522 }};
523 checkInvoke(a);
524 }
525
526 /**
527 * join of a forked task throws exception when task cancelled
528 */
529 public void testCancelledForkJoin() {
530 RecursiveAction a = new CheckedRecursiveAction() {
531 protected void realCompute() {
532 FibAction f = new FibAction(8);
533 assertTrue(f.cancel(true));
534 assertSame(f, f.fork());
535 try {
536 f.join();
537 shouldThrow();
538 } catch (CancellationException success) {
539 checkCancelled(f);
540 }
541 }};
542 checkInvoke(a);
543 }
544
545 /**
546 * get of a forked task throws exception when task cancelled
547 */
548 public void testCancelledForkGet() {
549 RecursiveAction a = new CheckedRecursiveAction() {
550 protected void realCompute() throws Exception {
551 FibAction f = new FibAction(8);
552 assertTrue(f.cancel(true));
553 assertSame(f, f.fork());
554 try {
555 f.get();
556 shouldThrow();
557 } catch (CancellationException success) {
558 checkCancelled(f);
559 }
560 }};
561 checkInvoke(a);
562 }
563
564 /**
565 * timed get of a forked task throws exception when task cancelled
566 */
567 public void testCancelledForkTimedGet() {
568 RecursiveAction a = new CheckedRecursiveAction() {
569 protected void realCompute() throws Exception {
570 FibAction f = new FibAction(8);
571 assertTrue(f.cancel(true));
572 assertSame(f, f.fork());
573 try {
574 f.get(5L, SECONDS);
575 shouldThrow();
576 } catch (CancellationException success) {
577 checkCancelled(f);
578 }
579 }};
580 checkInvoke(a);
581 }
582
583 /**
584 * quietlyJoin of a forked task returns when task cancelled
585 */
586 public void testCancelledForkQuietlyJoin() {
587 RecursiveAction a = new CheckedRecursiveAction() {
588 protected void realCompute() {
589 FibAction f = new FibAction(8);
590 assertTrue(f.cancel(true));
591 assertSame(f, f.fork());
592 f.quietlyJoin();
593 checkCancelled(f);
594 }};
595 checkInvoke(a);
596 }
597
598 /**
599 * inForkJoinPool of non-FJ task returns false
600 */
601 public void testInForkJoinPool2() {
602 RecursiveAction a = new CheckedRecursiveAction() {
603 protected void realCompute() {
604 assertFalse(inForkJoinPool());
605 }};
606 assertNull(a.invoke());
607 }
608
609 /**
610 * A reinitialized normally completed task may be re-invoked
611 */
612 public void testReinitialize() {
613 RecursiveAction a = new CheckedRecursiveAction() {
614 protected void realCompute() {
615 FibAction f = new FibAction(8);
616 checkNotDone(f);
617
618 for (int i = 0; i < 3; i++) {
619 assertNull(f.invoke());
620 assertEquals(21, f.result);
621 checkCompletedNormally(f);
622 f.reinitialize();
623 checkNotDone(f);
624 }
625 }};
626 checkInvoke(a);
627 }
628
629 /**
630 * A reinitialized abnormally completed task may be re-invoked
631 */
632 public void testReinitializeAbnormal() {
633 RecursiveAction a = new CheckedRecursiveAction() {
634 protected void realCompute() {
635 FailingFibAction f = new FailingFibAction(8);
636 checkNotDone(f);
637
638 for (int i = 0; i < 3; i++) {
639 try {
640 f.invoke();
641 shouldThrow();
642 } catch (FJException success) {
643 checkCompletedAbnormally(f, success);
644 }
645 f.reinitialize();
646 checkNotDone(f);
647 }
648 }};
649 checkInvoke(a);
650 }
651
652 /**
653 * invoke task throws exception after invoking completeExceptionally
654 */
655 public void testCompleteExceptionally() {
656 RecursiveAction a = new CheckedRecursiveAction() {
657 protected void realCompute() {
658 FibAction f = new FibAction(8);
659 f.completeExceptionally(new FJException());
660 try {
661 f.invoke();
662 shouldThrow();
663 } catch (FJException success) {
664 checkCompletedAbnormally(f, success);
665 }
666 }};
667 checkInvoke(a);
668 }
669
670 /**
671 * invoke task suppresses execution invoking complete
672 */
673 public void testComplete() {
674 RecursiveAction a = new CheckedRecursiveAction() {
675 protected void realCompute() {
676 FibAction f = new FibAction(8);
677 f.complete(null);
678 assertNull(f.invoke());
679 assertEquals(0, f.result);
680 checkCompletedNormally(f);
681 }};
682 checkInvoke(a);
683 }
684
685 /**
686 * invokeAll(t1, t2) invokes all task arguments
687 */
688 public void testInvokeAll2() {
689 RecursiveAction a = new CheckedRecursiveAction() {
690 protected void realCompute() {
691 FibAction f = new FibAction(8);
692 FibAction g = new FibAction(9);
693 invokeAll(f, g);
694 checkCompletedNormally(f);
695 assertEquals(21, f.result);
696 checkCompletedNormally(g);
697 assertEquals(34, g.result);
698 }};
699 checkInvoke(a);
700 }
701
702 /**
703 * invokeAll(tasks) with 1 argument invokes task
704 */
705 public void testInvokeAll1() {
706 RecursiveAction a = new CheckedRecursiveAction() {
707 protected void realCompute() {
708 FibAction f = new FibAction(8);
709 invokeAll(f);
710 checkCompletedNormally(f);
711 assertEquals(21, f.result);
712 }};
713 checkInvoke(a);
714 }
715
716 /**
717 * invokeAll(tasks) with > 2 argument invokes tasks
718 */
719 public void testInvokeAll3() {
720 RecursiveAction a = new CheckedRecursiveAction() {
721 protected void realCompute() {
722 FibAction f = new FibAction(8);
723 FibAction g = new FibAction(9);
724 FibAction h = new FibAction(7);
725 invokeAll(f, g, h);
726 assertTrue(f.isDone());
727 assertTrue(g.isDone());
728 assertTrue(h.isDone());
729 checkCompletedNormally(f);
730 assertEquals(21, f.result);
731 checkCompletedNormally(g);
732 assertEquals(34, g.result);
733 checkCompletedNormally(g);
734 assertEquals(13, h.result);
735 }};
736 checkInvoke(a);
737 }
738
739 /**
740 * invokeAll(collection) invokes all tasks in the collection
741 */
742 public void testInvokeAllCollection() {
743 RecursiveAction a = new CheckedRecursiveAction() {
744 protected void realCompute() {
745 FibAction f = new FibAction(8);
746 FibAction g = new FibAction(9);
747 FibAction h = new FibAction(7);
748 HashSet set = new HashSet();
749 set.add(f);
750 set.add(g);
751 set.add(h);
752 invokeAll(set);
753 assertTrue(f.isDone());
754 assertTrue(g.isDone());
755 assertTrue(h.isDone());
756 checkCompletedNormally(f);
757 assertEquals(21, f.result);
758 checkCompletedNormally(g);
759 assertEquals(34, g.result);
760 checkCompletedNormally(g);
761 assertEquals(13, h.result);
762 }};
763 checkInvoke(a);
764 }
765
766 /**
767 * invokeAll(tasks) with any null task throws NPE
768 */
769 public void testInvokeAllNPE() {
770 RecursiveAction a = new CheckedRecursiveAction() {
771 protected void realCompute() {
772 FibAction f = new FibAction(8);
773 FibAction g = new FibAction(9);
774 FibAction h = null;
775 try {
776 invokeAll(f, g, h);
777 shouldThrow();
778 } catch (NullPointerException success) {}
779 }};
780 checkInvoke(a);
781 }
782
783 /**
784 * invokeAll(t1, t2) throw exception if any task does
785 */
786 public void testAbnormalInvokeAll2() {
787 RecursiveAction a = new CheckedRecursiveAction() {
788 protected void realCompute() {
789 FibAction f = new FibAction(8);
790 FailingFibAction g = new FailingFibAction(9);
791 try {
792 invokeAll(f, g);
793 shouldThrow();
794 } catch (FJException success) {
795 checkCompletedAbnormally(g, success);
796 }
797 }};
798 checkInvoke(a);
799 }
800
801 /**
802 * invokeAll(tasks) with 1 argument throws exception if task does
803 */
804 public void testAbnormalInvokeAll1() {
805 RecursiveAction a = new CheckedRecursiveAction() {
806 protected void realCompute() {
807 FailingFibAction g = new FailingFibAction(9);
808 try {
809 invokeAll(g);
810 shouldThrow();
811 } catch (FJException success) {
812 checkCompletedAbnormally(g, success);
813 }
814 }};
815 checkInvoke(a);
816 }
817
818 /**
819 * invokeAll(tasks) with > 2 argument throws exception if any task does
820 */
821 public void testAbnormalInvokeAll3() {
822 RecursiveAction a = new CheckedRecursiveAction() {
823 protected void realCompute() {
824 FibAction f = new FibAction(8);
825 FailingFibAction g = new FailingFibAction(9);
826 FibAction h = new FibAction(7);
827 try {
828 invokeAll(f, g, h);
829 shouldThrow();
830 } catch (FJException success) {
831 checkCompletedAbnormally(g, success);
832 }
833 }};
834 checkInvoke(a);
835 }
836
837 /**
838 * invokeAll(collection) throws exception if any task does
839 */
840 public void testAbnormalInvokeAllCollection() {
841 RecursiveAction a = new CheckedRecursiveAction() {
842 protected void realCompute() {
843 FailingFibAction f = new FailingFibAction(8);
844 FibAction g = new FibAction(9);
845 FibAction h = new FibAction(7);
846 HashSet set = new HashSet();
847 set.add(f);
848 set.add(g);
849 set.add(h);
850 try {
851 invokeAll(set);
852 shouldThrow();
853 } catch (FJException success) {
854 checkCompletedAbnormally(f, success);
855 }
856 }};
857 checkInvoke(a);
858 }
859
860 // CountedCompleter versions
861
862 abstract static class CCF extends CountedCompleter {
863 int number;
864 int rnumber;
865
866 public CCF(CountedCompleter parent, int n) {
867 super(parent, 1);
868 this.number = n;
869 }
870
871 public final void compute() {
872 CountedCompleter p;
873 CCF f = this;
874 int n = number;
875 while (n >= 2) {
876 new RCCF(f, n - 2).fork();
877 f = new LCCF(f, --n);
878 }
879 f.number = n;
880 f.onCompletion(f);
881 if ((p = f.getCompleter()) != null)
882 p.tryComplete();
883 else
884 f.quietlyComplete();
885 }
886 }
887
888 static final class LCCF extends CCF {
889 public LCCF(CountedCompleter parent, int n) {
890 super(parent, n);
891 }
892 public final void onCompletion(CountedCompleter caller) {
893 CCF p = (CCF)getCompleter();
894 int n = number + rnumber;
895 if (p != null)
896 p.number = n;
897 else
898 number = n;
899 }
900 }
901 static final class RCCF extends CCF {
902 public RCCF(CountedCompleter parent, int n) {
903 super(parent, n);
904 }
905 public final void onCompletion(CountedCompleter caller) {
906 CCF p = (CCF)getCompleter();
907 int n = number + rnumber;
908 if (p != null)
909 p.rnumber = n;
910 else
911 number = n;
912 }
913 }
914
915 // Version of CCF with forced failure in left completions
916 abstract static class FailingCCF extends CountedCompleter {
917 int number;
918 int rnumber;
919
920 public FailingCCF(CountedCompleter parent, int n) {
921 super(parent, 1);
922 this.number = n;
923 }
924
925 public final void compute() {
926 CountedCompleter p;
927 FailingCCF f = this;
928 int n = number;
929 while (n >= 2) {
930 new RFCCF(f, n - 2).fork();
931 f = new LFCCF(f, --n);
932 }
933 f.number = n;
934 f.onCompletion(f);
935 if ((p = f.getCompleter()) != null)
936 p.tryComplete();
937 else
938 f.quietlyComplete();
939 }
940 }
941
942 static final class LFCCF extends FailingCCF {
943 public LFCCF(CountedCompleter parent, int n) {
944 super(parent, n);
945 }
946 public final void onCompletion(CountedCompleter caller) {
947 FailingCCF p = (FailingCCF)getCompleter();
948 int n = number + rnumber;
949 if (p != null)
950 p.number = n;
951 else
952 number = n;
953 }
954 }
955 static final class RFCCF extends FailingCCF {
956 public RFCCF(CountedCompleter parent, int n) {
957 super(parent, n);
958 }
959 public final void onCompletion(CountedCompleter caller) {
960 completeExceptionally(new FJException());
961 }
962 }
963
964 /**
965 * invoke returns when task completes normally.
966 * isCompletedAbnormally and isCancelled return false for normally
967 * completed tasks; getRawResult returns null.
968 */
969 public void testInvokeCC() {
970 ForkJoinTask a = new CheckedRecursiveAction() {
971 protected void realCompute() {
972 CCF f = new LCCF(null, 8);
973 assertNull(f.invoke());
974 assertEquals(21, f.number);
975 checkCompletedNormally(f);
976 }};
977 checkInvoke(a);
978 }
979
980 /**
981 * quietlyInvoke task returns when task completes normally.
982 * isCompletedAbnormally and isCancelled return false for normally
983 * completed tasks
984 */
985 public void testQuietlyInvokeCC() {
986 ForkJoinTask a = new CheckedRecursiveAction() {
987 protected void realCompute() {
988 CCF f = new LCCF(null, 8);
989 f.quietlyInvoke();
990 assertEquals(21, f.number);
991 checkCompletedNormally(f);
992 }};
993 checkInvoke(a);
994 }
995
996 /**
997 * join of a forked task returns when task completes
998 */
999 public void testForkJoinCC() {
1000 ForkJoinTask a = new CheckedRecursiveAction() {
1001 protected void realCompute() {
1002 CCF f = new LCCF(null, 8);
1003 assertSame(f, f.fork());
1004 assertNull(f.join());
1005 assertEquals(21, f.number);
1006 checkCompletedNormally(f);
1007 }};
1008 checkInvoke(a);
1009 }
1010
1011 /**
1012 * get of a forked task returns when task completes
1013 */
1014 public void testForkGetCC() {
1015 ForkJoinTask a = new CheckedRecursiveAction() {
1016 protected void realCompute() throws Exception {
1017 CCF f = new LCCF(null, 8);
1018 assertSame(f, f.fork());
1019 assertNull(f.get());
1020 assertEquals(21, f.number);
1021 checkCompletedNormally(f);
1022 }};
1023 checkInvoke(a);
1024 }
1025
1026 /**
1027 * timed get of a forked task returns when task completes
1028 */
1029 public void testForkTimedGetCC() {
1030 ForkJoinTask a = new CheckedRecursiveAction() {
1031 protected void realCompute() throws Exception {
1032 CCF f = new LCCF(null, 8);
1033 assertSame(f, f.fork());
1034 assertNull(f.get(LONG_DELAY_MS, MILLISECONDS));
1035 assertEquals(21, f.number);
1036 checkCompletedNormally(f);
1037 }};
1038 checkInvoke(a);
1039 }
1040
1041 /**
1042 * timed get with null time unit throws NPE
1043 */
1044 public void testForkTimedGetNPECC() {
1045 ForkJoinTask a = new CheckedRecursiveAction() {
1046 protected void realCompute() throws Exception {
1047 CCF f = new LCCF(null, 8);
1048 assertSame(f, f.fork());
1049 try {
1050 f.get(5L, null);
1051 shouldThrow();
1052 } catch (NullPointerException success) {}
1053 }};
1054 checkInvoke(a);
1055 }
1056
1057 /**
1058 * quietlyJoin of a forked task returns when task completes
1059 */
1060 public void testForkQuietlyJoinCC() {
1061 ForkJoinTask a = new CheckedRecursiveAction() {
1062 protected void realCompute() {
1063 CCF f = new LCCF(null, 8);
1064 assertSame(f, f.fork());
1065 f.quietlyJoin();
1066 assertEquals(21, f.number);
1067 checkCompletedNormally(f);
1068 }};
1069 checkInvoke(a);
1070 }
1071
1072 /**
1073 * invoke task throws exception when task completes abnormally
1074 */
1075 public void testAbnormalInvokeCC() {
1076 ForkJoinTask a = new CheckedRecursiveAction() {
1077 protected void realCompute() {
1078 FailingCCF f = new LFCCF(null, 8);
1079 try {
1080 f.invoke();
1081 shouldThrow();
1082 } catch (FJException success) {
1083 checkCompletedAbnormally(f, success);
1084 }
1085 }};
1086 checkInvoke(a);
1087 }
1088
1089 /**
1090 * quietlyInvoke task returns when task completes abnormally
1091 */
1092 public void testAbnormalQuietlyInvokeCC() {
1093 ForkJoinTask a = new CheckedRecursiveAction() {
1094 protected void realCompute() {
1095 FailingCCF f = new LFCCF(null, 8);
1096 f.quietlyInvoke();
1097 assertTrue(f.getException() instanceof FJException);
1098 checkCompletedAbnormally(f, f.getException());
1099 }};
1100 checkInvoke(a);
1101 }
1102
1103 /**
1104 * join of a forked task throws exception when task completes abnormally
1105 */
1106 public void testAbnormalForkJoinCC() {
1107 ForkJoinTask a = new CheckedRecursiveAction() {
1108 protected void realCompute() {
1109 FailingCCF f = new LFCCF(null, 8);
1110 assertSame(f, f.fork());
1111 try {
1112 f.join();
1113 shouldThrow();
1114 } catch (FJException success) {
1115 checkCompletedAbnormally(f, success);
1116 }
1117 }};
1118 checkInvoke(a);
1119 }
1120
1121 /**
1122 * get of a forked task throws exception when task completes abnormally
1123 */
1124 public void testAbnormalForkGetCC() {
1125 ForkJoinTask a = new CheckedRecursiveAction() {
1126 protected void realCompute() throws Exception {
1127 FailingCCF f = new LFCCF(null, 8);
1128 assertSame(f, f.fork());
1129 try {
1130 f.get();
1131 shouldThrow();
1132 } catch (ExecutionException success) {
1133 Throwable cause = success.getCause();
1134 assertTrue(cause instanceof FJException);
1135 checkCompletedAbnormally(f, cause);
1136 }
1137 }};
1138 checkInvoke(a);
1139 }
1140
1141 /**
1142 * timed get of a forked task throws exception when task completes abnormally
1143 */
1144 public void testAbnormalForkTimedGetCC() {
1145 ForkJoinTask a = new CheckedRecursiveAction() {
1146 protected void realCompute() throws Exception {
1147 FailingCCF f = new LFCCF(null, 8);
1148 assertSame(f, f.fork());
1149 try {
1150 f.get(LONG_DELAY_MS, MILLISECONDS);
1151 shouldThrow();
1152 } catch (ExecutionException success) {
1153 Throwable cause = success.getCause();
1154 assertTrue(cause instanceof FJException);
1155 checkCompletedAbnormally(f, cause);
1156 }
1157 }};
1158 checkInvoke(a);
1159 }
1160
1161 /**
1162 * quietlyJoin of a forked task returns when task completes abnormally
1163 */
1164 public void testAbnormalForkQuietlyJoinCC() {
1165 ForkJoinTask a = new CheckedRecursiveAction() {
1166 protected void realCompute() {
1167 FailingCCF f = new LFCCF(null, 8);
1168 assertSame(f, f.fork());
1169 f.quietlyJoin();
1170 assertTrue(f.getException() instanceof FJException);
1171 checkCompletedAbnormally(f, f.getException());
1172 }};
1173 checkInvoke(a);
1174 }
1175
1176 /**
1177 * invoke task throws exception when task cancelled
1178 */
1179 public void testCancelledInvokeCC() {
1180 ForkJoinTask a = new CheckedRecursiveAction() {
1181 protected void realCompute() {
1182 CCF f = new LCCF(null, 8);
1183 assertTrue(f.cancel(true));
1184 try {
1185 f.invoke();
1186 shouldThrow();
1187 } catch (CancellationException success) {
1188 checkCancelled(f);
1189 }
1190 }};
1191 checkInvoke(a);
1192 }
1193
1194 /**
1195 * join of a forked task throws exception when task cancelled
1196 */
1197 public void testCancelledForkJoinCC() {
1198 ForkJoinTask a = new CheckedRecursiveAction() {
1199 protected void realCompute() {
1200 CCF f = new LCCF(null, 8);
1201 assertTrue(f.cancel(true));
1202 assertSame(f, f.fork());
1203 try {
1204 f.join();
1205 shouldThrow();
1206 } catch (CancellationException success) {
1207 checkCancelled(f);
1208 }
1209 }};
1210 checkInvoke(a);
1211 }
1212
1213 /**
1214 * get of a forked task throws exception when task cancelled
1215 */
1216 public void testCancelledForkGetCC() {
1217 ForkJoinTask a = new CheckedRecursiveAction() {
1218 protected void realCompute() throws Exception {
1219 CCF f = new LCCF(null, 8);
1220 assertTrue(f.cancel(true));
1221 assertSame(f, f.fork());
1222 try {
1223 f.get();
1224 shouldThrow();
1225 } catch (CancellationException success) {
1226 checkCancelled(f);
1227 }
1228 }};
1229 checkInvoke(a);
1230 }
1231
1232 /**
1233 * timed get of a forked task throws exception when task cancelled
1234 */
1235 public void testCancelledForkTimedGetCC() throws Exception {
1236 ForkJoinTask a = new CheckedRecursiveAction() {
1237 protected void realCompute() throws Exception {
1238 CCF f = new LCCF(null, 8);
1239 assertTrue(f.cancel(true));
1240 assertSame(f, f.fork());
1241 try {
1242 f.get(LONG_DELAY_MS, MILLISECONDS);
1243 shouldThrow();
1244 } catch (CancellationException success) {
1245 checkCancelled(f);
1246 }
1247 }};
1248 checkInvoke(a);
1249 }
1250
1251 /**
1252 * quietlyJoin of a forked task returns when task cancelled
1253 */
1254 public void testCancelledForkQuietlyJoinCC() {
1255 ForkJoinTask a = new CheckedRecursiveAction() {
1256 protected void realCompute() {
1257 CCF f = new LCCF(null, 8);
1258 assertTrue(f.cancel(true));
1259 assertSame(f, f.fork());
1260 f.quietlyJoin();
1261 checkCancelled(f);
1262 }};
1263 checkInvoke(a);
1264 }
1265
1266 /**
1267 * getPool of non-FJ task returns null
1268 */
1269 public void testGetPool2CC() {
1270 ForkJoinTask a = new CheckedRecursiveAction() {
1271 protected void realCompute() {
1272 assertNull(getPool());
1273 }};
1274 assertNull(a.invoke());
1275 }
1276
1277 /**
1278 * inForkJoinPool of non-FJ task returns false
1279 */
1280 public void testInForkJoinPool2CC() {
1281 ForkJoinTask a = new CheckedRecursiveAction() {
1282 protected void realCompute() {
1283 assertFalse(inForkJoinPool());
1284 }};
1285 assertNull(a.invoke());
1286 }
1287
1288 /**
1289 * setRawResult(null) succeeds
1290 */
1291 public void testSetRawResultCC() {
1292 ForkJoinTask a = new CheckedRecursiveAction() {
1293 protected void realCompute() {
1294 setRawResult(null);
1295 assertNull(getRawResult());
1296 }};
1297 assertNull(a.invoke());
1298 }
1299
1300 /**
1301 * invoke task throws exception after invoking completeExceptionally
1302 */
1303 public void testCompleteExceptionally2CC() {
1304 ForkJoinTask a = new CheckedRecursiveAction() {
1305 protected void realCompute() {
1306 CCF f = new LCCF(null, 8);
1307 f.completeExceptionally(new FJException());
1308 try {
1309 f.invoke();
1310 shouldThrow();
1311 } catch (FJException success) {
1312 checkCompletedAbnormally(f, success);
1313 }
1314 }};
1315 checkInvoke(a);
1316 }
1317
1318 /**
1319 * invokeAll(t1, t2) invokes all task arguments
1320 */
1321 public void testInvokeAll2CC() {
1322 ForkJoinTask a = new CheckedRecursiveAction() {
1323 protected void realCompute() {
1324 CCF f = new LCCF(null, 8);
1325 CCF g = new LCCF(null, 9);
1326 invokeAll(f, g);
1327 assertEquals(21, f.number);
1328 assertEquals(34, g.number);
1329 checkCompletedNormally(f);
1330 checkCompletedNormally(g);
1331 }};
1332 checkInvoke(a);
1333 }
1334
1335 /**
1336 * invokeAll(tasks) with 1 argument invokes task
1337 */
1338 public void testInvokeAll1CC() {
1339 ForkJoinTask a = new CheckedRecursiveAction() {
1340 protected void realCompute() {
1341 CCF f = new LCCF(null, 8);
1342 invokeAll(f);
1343 checkCompletedNormally(f);
1344 assertEquals(21, f.number);
1345 }};
1346 checkInvoke(a);
1347 }
1348
1349 /**
1350 * invokeAll(tasks) with > 2 argument invokes tasks
1351 */
1352 public void testInvokeAll3CC() {
1353 ForkJoinTask a = new CheckedRecursiveAction() {
1354 protected void realCompute() {
1355 CCF f = new LCCF(null, 8);
1356 CCF g = new LCCF(null, 9);
1357 CCF h = new LCCF(null, 7);
1358 invokeAll(f, g, h);
1359 assertEquals(21, f.number);
1360 assertEquals(34, g.number);
1361 assertEquals(13, h.number);
1362 checkCompletedNormally(f);
1363 checkCompletedNormally(g);
1364 checkCompletedNormally(h);
1365 }};
1366 checkInvoke(a);
1367 }
1368
1369 /**
1370 * invokeAll(collection) invokes all tasks in the collection
1371 */
1372 public void testInvokeAllCollectionCC() {
1373 ForkJoinTask a = new CheckedRecursiveAction() {
1374 protected void realCompute() {
1375 CCF f = new LCCF(null, 8);
1376 CCF g = new LCCF(null, 9);
1377 CCF h = new LCCF(null, 7);
1378 HashSet set = new HashSet();
1379 set.add(f);
1380 set.add(g);
1381 set.add(h);
1382 invokeAll(set);
1383 assertEquals(21, f.number);
1384 assertEquals(34, g.number);
1385 assertEquals(13, h.number);
1386 checkCompletedNormally(f);
1387 checkCompletedNormally(g);
1388 checkCompletedNormally(h);
1389 }};
1390 checkInvoke(a);
1391 }
1392
1393 /**
1394 * invokeAll(tasks) with any null task throws NPE
1395 */
1396 public void testInvokeAllNPECC() {
1397 ForkJoinTask a = new CheckedRecursiveAction() {
1398 protected void realCompute() {
1399 CCF f = new LCCF(null, 8);
1400 CCF g = new LCCF(null, 9);
1401 CCF h = null;
1402 try {
1403 invokeAll(f, g, h);
1404 shouldThrow();
1405 } catch (NullPointerException success) {}
1406 }};
1407 checkInvoke(a);
1408 }
1409
1410 /**
1411 * invokeAll(t1, t2) throw exception if any task does
1412 */
1413 public void testAbnormalInvokeAll2CC() {
1414 ForkJoinTask a = new CheckedRecursiveAction() {
1415 protected void realCompute() {
1416 CCF f = new LCCF(null, 8);
1417 FailingCCF g = new LFCCF(null, 9);
1418 try {
1419 invokeAll(f, g);
1420 shouldThrow();
1421 } catch (FJException success) {
1422 checkCompletedAbnormally(g, success);
1423 }
1424 }};
1425 checkInvoke(a);
1426 }
1427
1428 /**
1429 * invokeAll(tasks) with 1 argument throws exception if task does
1430 */
1431 public void testAbnormalInvokeAll1CC() {
1432 ForkJoinTask a = new CheckedRecursiveAction() {
1433 protected void realCompute() {
1434 FailingCCF g = new LFCCF(null, 9);
1435 try {
1436 invokeAll(g);
1437 shouldThrow();
1438 } catch (FJException success) {
1439 checkCompletedAbnormally(g, success);
1440 }
1441 }};
1442 checkInvoke(a);
1443 }
1444
1445 /**
1446 * invokeAll(tasks) with > 2 argument throws exception if any task does
1447 */
1448 public void testAbnormalInvokeAll3CC() {
1449 ForkJoinTask a = new CheckedRecursiveAction() {
1450 protected void realCompute() {
1451 CCF f = new LCCF(null, 8);
1452 FailingCCF g = new LFCCF(null, 9);
1453 CCF h = new LCCF(null, 7);
1454 try {
1455 invokeAll(f, g, h);
1456 shouldThrow();
1457 } catch (FJException success) {
1458 checkCompletedAbnormally(g, success);
1459 }
1460 }};
1461 checkInvoke(a);
1462 }
1463
1464 /**
1465 * invokeAll(collection) throws exception if any task does
1466 */
1467 public void testAbnormalInvokeAllCollectionCC() {
1468 ForkJoinTask a = new CheckedRecursiveAction() {
1469 protected void realCompute() {
1470 FailingCCF f = new LFCCF(null, 8);
1471 CCF g = new LCCF(null, 9);
1472 CCF h = new LCCF(null, 7);
1473 HashSet set = new HashSet();
1474 set.add(f);
1475 set.add(g);
1476 set.add(h);
1477 try {
1478 invokeAll(set);
1479 shouldThrow();
1480 } catch (FJException success) {
1481 checkCompletedAbnormally(f, success);
1482 }
1483 }};
1484 checkInvoke(a);
1485 }
1486
1487
1488 /**
1489 * awaitQuiescent by a worker is equivalent in effect to
1490 * ForkJoinTask.helpQuiesce()
1491 */
1492 public void testAwaitQuiescent1() throws Exception {
1493 final ForkJoinPool p = new ForkJoinPool();
1494 try {
1495 final long startTime = System.nanoTime();
1496 assertTrue(p.isQuiescent());
1497 ForkJoinTask a = new CheckedRecursiveAction() {
1498 protected void realCompute() {
1499 FibAction f = new FibAction(8);
1500 assertSame(f, f.fork());
1501 boolean t = ForkJoinTask.getPool().awaitQuiescence(MEDIUM_DELAY_MS, TimeUnit.SECONDS);
1502 assertTrue(t);
1503 while (!f.isDone()) {
1504 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1505 threadFail("timed out");
1506 assertFalse(p.getAsyncMode());
1507 assertFalse(p.isShutdown());
1508 assertFalse(p.isTerminating());
1509 assertFalse(p.isTerminated());
1510 Thread.yield();
1511 }
1512 assertFalse(p.isQuiescent());
1513 assertEquals(0, ForkJoinTask.getQueuedTaskCount());
1514 try {
1515 assertEquals(21, f.result);
1516 } catch (Throwable fail) {
1517 threadFail(fail.getMessage());
1518 }
1519 }
1520 };
1521 p.execute(a);
1522 while (!a.isDone() || !p.isQuiescent()) {
1523 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1524 throw new AssertionFailedError("timed out");
1525 assertFalse(p.getAsyncMode());
1526 assertFalse(p.isShutdown());
1527 assertFalse(p.isTerminating());
1528 assertFalse(p.isTerminated());
1529 Thread.yield();
1530 }
1531 assertEquals(0, p.getQueuedTaskCount());
1532 assertFalse(p.getAsyncMode());
1533 assertEquals(0, p.getActiveThreadCount());
1534 assertEquals(0, p.getQueuedTaskCount());
1535 assertEquals(0, p.getQueuedSubmissionCount());
1536 assertFalse(p.hasQueuedSubmissions());
1537 assertFalse(p.isShutdown());
1538 assertFalse(p.isTerminating());
1539 assertFalse(p.isTerminated());
1540 } finally {
1541 joinPool(p);
1542 }
1543 }
1544
1545 /**
1546 * awaitQuiescent returns when pool isQuiescent() or the indicated
1547 * timeout elapse
1548 */
1549 public void testAwaitQuiescent2() throws Exception {
1550 final ForkJoinPool p = new ForkJoinPool();
1551 try {
1552 final long startTime = System.nanoTime();
1553 assertTrue(p.isQuiescent());
1554 ForkJoinTask a = new CheckedRecursiveAction() {
1555 protected void realCompute() {
1556 FibAction f = new FibAction(8);
1557 assertSame(f, f.fork());
1558 ForkJoinTask.helpQuiesce();
1559 while (!f.isDone()) {
1560 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1561 threadFail("timed out");
1562 assertFalse(p.getAsyncMode());
1563 assertFalse(p.isShutdown());
1564 assertFalse(p.isTerminating());
1565 assertFalse(p.isTerminated());
1566 Thread.yield();
1567 }
1568 assertEquals(0, ForkJoinTask.getQueuedTaskCount());
1569 try {
1570 assertEquals(21, f.result);
1571 } catch (Throwable fail) { System.out.println("fail " + fail.getMessage()); }
1572 }
1573 };
1574 p.execute(a);
1575 while (!p.awaitQuiescence(LONG_DELAY_MS, MILLISECONDS)) {
1576 if (millisElapsedSince(startTime) > LONG_DELAY_MS)
1577 threadFail("timed out");
1578 assertFalse(p.getAsyncMode());
1579 assertFalse(p.isShutdown());
1580 assertFalse(p.isTerminating());
1581 assertFalse(p.isTerminated());
1582 Thread.yield();
1583 }
1584 assertTrue(p.isQuiescent());
1585 assertTrue(a.isDone());
1586 assertEquals(0, p.getQueuedTaskCount());
1587 assertFalse(p.getAsyncMode());
1588 assertEquals(0, p.getActiveThreadCount());
1589 assertEquals(0, p.getQueuedTaskCount());
1590 assertEquals(0, p.getQueuedSubmissionCount());
1591 assertFalse(p.hasQueuedSubmissions());
1592 assertFalse(p.isShutdown());
1593 assertFalse(p.isTerminating());
1594 assertFalse(p.isTerminated());
1595 } finally {
1596 joinPool(p);
1597 }
1598 }
1599
1600 }