ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPool8Test.java
Revision: 1.28
Committed: Wed Dec 31 16:44:01 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.27: +1 -5 lines
Log Message:
remove unused imports

File Contents

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