ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/PhaserTest.java
Revision: 1.25
Committed: Tue Nov 30 01:56:12 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.24: +17 -18 lines
Log Message:
more assertions, now that we have TERMINATION_BIT

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 * Other contributors include John Vint
6 */
7
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.concurrent.atomic.AtomicInteger;
11 import java.util.concurrent.atomic.AtomicBoolean;
12 import java.util.concurrent.*;
13 import static java.util.concurrent.TimeUnit.MILLISECONDS;
14 import static java.util.concurrent.TimeUnit.NANOSECONDS;
15 import junit.framework.Test;
16 import junit.framework.TestSuite;
17
18 public class PhaserTest extends JSR166TestCase {
19
20 public static void main(String[] args) {
21 junit.textui.TestRunner.run(suite());
22 }
23
24 public static Test suite() {
25 return new TestSuite(PhaserTest.class);
26 }
27
28 private static final int maxParties = 65535;
29
30 /** Checks state of phaser. */
31 protected void assertState(Phaser phaser,
32 int phase, int parties, int unarrived) {
33 assertEquals(phase, phaser.getPhase());
34 assertEquals(parties, phaser.getRegisteredParties());
35 assertEquals(unarrived, phaser.getUnarrivedParties());
36 assertEquals(parties - unarrived, phaser.getArrivedParties());
37 assertTrue((phaser.getPhase() >= 0) ^ phaser.isTerminated());
38 }
39
40 /** Checks state of terminated phaser. */
41 protected void assertTerminated(Phaser phaser,
42 int maxPhase, int parties, int unarrived) {
43 assertTrue(phaser.isTerminated());
44 int expectedPhase = maxPhase + Integer.MIN_VALUE;
45 assertState(phaser, expectedPhase, parties, unarrived);
46 assertEquals(expectedPhase, phaser.register());
47 assertEquals(expectedPhase, phaser.arrive());
48 assertEquals(expectedPhase, phaser.arriveAndDeregister());
49 }
50
51 protected void assertTerminated(Phaser phaser, int maxPhase) {
52 assertTerminated(phaser, maxPhase, 0, 0);
53 }
54
55 /**
56 * Empty constructor builds a new Phaser with no parent, no registered
57 * parties and initial phase number of 0
58 */
59 public void testConstructorDefaultValues() {
60 Phaser phaser = new Phaser();
61 assertNull(phaser.getParent());
62 assertEquals(0, phaser.getRegisteredParties());
63 assertEquals(0, phaser.getArrivedParties());
64 assertEquals(0, phaser.getUnarrivedParties());
65 assertEquals(0, phaser.getPhase());
66 }
67
68 /**
69 * Constructing with a negative number of parties throws
70 * IllegalArgumentException
71 */
72 public void testConstructorNegativeParties() {
73 try {
74 new Phaser(-1);
75 shouldThrow();
76 } catch (IllegalArgumentException success) {}
77 }
78
79 /**
80 * Constructing with a negative number of parties throws
81 * IllegalArgumentException
82 */
83 public void testConstructorNegativeParties2() {
84 try {
85 new Phaser(new Phaser(), -1);
86 shouldThrow();
87 } catch (IllegalArgumentException success) {}
88 }
89
90 /**
91 * Constructing with a number of parties > 65535 throws
92 * IllegalArgumentException
93 */
94 public void testConstructorPartiesExceedsLimit() {
95 new Phaser(maxParties);
96 try {
97 new Phaser(maxParties + 1);
98 shouldThrow();
99 } catch (IllegalArgumentException success) {}
100
101 new Phaser(new Phaser(), maxParties);
102 try {
103 new Phaser(new Phaser(), maxParties + 1);
104 shouldThrow();
105 } catch (IllegalArgumentException success) {}
106 }
107
108 /**
109 * The parent provided to the constructor should be returned from
110 * a later call to getParent
111 */
112 public void testConstructor3() {
113 Phaser parent = new Phaser();
114 assertSame(parent, new Phaser(parent).getParent());
115 assertNull(new Phaser(null).getParent());
116 }
117
118 /**
119 * The parent being input into the parameter should equal the original
120 * parent when being returned
121 */
122 public void testConstructor5() {
123 Phaser parent = new Phaser();
124 assertSame(parent, new Phaser(parent, 0).getParent());
125 assertNull(new Phaser(null, 0).getParent());
126 }
127
128 /**
129 * register() will increment the number of unarrived parties by
130 * one and not affect its arrived parties
131 */
132 public void testRegister1() {
133 Phaser phaser = new Phaser();
134 assertState(phaser, 0, 0, 0);
135 assertEquals(0, phaser.register());
136 assertState(phaser, 0, 1, 1);
137 }
138
139 /**
140 * Registering more than 65536 parties causes IllegalStateException
141 */
142 public void testRegister2() {
143 Phaser phaser = new Phaser(0);
144 assertState(phaser, 0, 0, 0);
145 assertEquals(0, phaser.bulkRegister(maxParties - 10));
146 assertState(phaser, 0, maxParties - 10, maxParties - 10);
147 for (int i = 0; i < 10; i++) {
148 assertState(phaser, 0, maxParties - 10 + i, maxParties - 10 + i);
149 assertEquals(0, phaser.register());
150 }
151 assertState(phaser, 0, maxParties, maxParties);
152 try {
153 phaser.register();
154 shouldThrow();
155 } catch (IllegalStateException success) {}
156
157 try {
158 phaser.bulkRegister(Integer.MAX_VALUE);
159 shouldThrow();
160 } catch (IllegalStateException success) {}
161 }
162
163 /**
164 * register() correctly returns the current barrier phase number when
165 * invoked
166 */
167 public void testRegister3() {
168 Phaser phaser = new Phaser();
169 assertEquals(0, phaser.register());
170 assertEquals(0, phaser.arrive());
171 assertEquals(1, phaser.register());
172 assertState(phaser, 1, 2, 2);
173 }
174
175 /**
176 * register causes the next arrive to not increment the phase rather retain
177 * the phase number
178 */
179 public void testRegister4() {
180 Phaser phaser = new Phaser(1);
181 assertEquals(0, phaser.arrive());
182 assertEquals(1, phaser.register());
183 assertEquals(1, phaser.arrive());
184 assertState(phaser, 1, 2, 1);
185 }
186
187 /**
188 * Invoking bulkRegister with a negative parameter throws an
189 * IllegalArgumentException
190 */
191 public void testBulkRegister1() {
192 try {
193 new Phaser().bulkRegister(-1);
194 shouldThrow();
195 } catch (IllegalArgumentException success) {}
196 }
197
198 /**
199 * bulkRegister should correctly record the number of unarrived parties with
200 * the number of parties being registered
201 */
202 public void testBulkRegister2() {
203 Phaser phaser = new Phaser();
204 assertEquals(0, phaser.bulkRegister(20));
205 assertState(phaser, 0, 20, 20);
206 }
207
208 /**
209 * Registering with a number of parties greater than or equal to 1<<16
210 * throws IllegalStateException.
211 */
212 public void testBulkRegister3() {
213 assertEquals(0, new Phaser().bulkRegister((1 << 16) - 1));
214
215 try {
216 new Phaser().bulkRegister(1 << 16);
217 shouldThrow();
218 } catch (IllegalStateException success) {}
219
220 try {
221 new Phaser(2).bulkRegister((1 << 16) - 2);
222 shouldThrow();
223 } catch (IllegalStateException success) {}
224 }
225
226 /**
227 * the phase number increments correctly when tripping the barrier
228 */
229 public void testPhaseIncrement1() {
230 for (int size = 1; size < nine; size++) {
231 final Phaser phaser = new Phaser(size);
232 for (int index = 0; index <= (1 << size); index++) {
233 int phase = phaser.arrive();
234 assertTrue(index % size == 0 ? (index / size) == phase : index - (phase * size) > 0);
235 }
236 }
237 }
238
239 /**
240 * arrive() on a registered phaser increments phase.
241 */
242 public void testArrive1() {
243 Phaser phaser = new Phaser(1);
244 assertState(phaser, 0, 1, 1);
245 assertEquals(0, phaser.arrive());
246 assertState(phaser, 1, 1, 1);
247 }
248
249 /**
250 * arriveAndDeregister does not wait for others to arrive at barrier
251 */
252 public void testArriveAndDeregister() throws InterruptedException {
253 final Phaser phaser = new Phaser(1);
254 for (int i = 0; i < 10; i++) {
255 assertState(phaser, 0, 1, 1);
256 assertEquals(0, phaser.register());
257 assertState(phaser, 0, 2, 2);
258 assertEquals(0, phaser.arriveAndDeregister());
259 assertState(phaser, 0, 1, 1);
260 }
261 assertEquals(0, phaser.arriveAndDeregister());
262 assertTerminated(phaser, 1);
263 }
264
265 /**
266 * arriveAndDeregister does not wait for others to arrive at barrier
267 */
268 public void testArrive2() throws InterruptedException {
269 final Phaser phaser = new Phaser();
270 assertEquals(0, phaser.register());
271 List<Thread> threads = new ArrayList<Thread>();
272 for (int i = 0; i < 10; i++) {
273 assertEquals(0, phaser.register());
274 threads.add(newStartedThread(new CheckedRunnable() {
275 public void realRun() throws InterruptedException {
276 assertEquals(0, phaser.arriveAndDeregister());
277 }}));
278 }
279
280 for (Thread thread : threads)
281 awaitTermination(thread, LONG_DELAY_MS);
282 assertState(phaser, 0, 1, 1);
283 assertEquals(0, phaser.arrive());
284 assertState(phaser, 1, 1, 1);
285 }
286
287 /**
288 * arrive() returns a negative number if the Phaser is terminated
289 */
290 public void testArrive3() {
291 Phaser phaser = new Phaser(1);
292 phaser.forceTermination();
293 assertTerminated(phaser, 0, 1, 1);
294 assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
295 assertTrue(phaser.arrive() < 0);
296 assertTrue(phaser.register() < 0);
297 assertTrue(phaser.arriveAndDeregister() < 0);
298 assertTrue(phaser.awaitAdvance(1) < 0);
299 assertTrue(phaser.getPhase() < 0);
300 }
301
302 /**
303 * arriveAndDeregister() throws IllegalStateException if number of
304 * registered or unarrived parties would become negative
305 */
306 public void testArriveAndDeregister1() {
307 try {
308 Phaser phaser = new Phaser();
309 phaser.arriveAndDeregister();
310 shouldThrow();
311 } catch (IllegalStateException success) {}
312 }
313
314 /**
315 * arriveAndDeregister reduces the number of arrived parties
316 */
317 public void testArriveAndDeregister2() {
318 final Phaser phaser = new Phaser(1);
319 assertEquals(0, phaser.register());
320 assertEquals(0, phaser.arrive());
321 assertState(phaser, 0, 2, 1);
322 assertEquals(0, phaser.arriveAndDeregister());
323 assertState(phaser, 1, 1, 1);
324 }
325
326 /**
327 * arriveAndDeregister arrives at the barrier on a phaser with a parent and
328 * when a deregistration occurs and causes the phaser to have zero parties
329 * its parent will be deregistered as well
330 */
331 public void testArriveAndDeregister3() {
332 Phaser parent = new Phaser();
333 Phaser child = new Phaser(parent);
334 assertState(child, 0, 0, 0);
335 assertState(parent, 0, 0, 0);
336 assertEquals(0, child.register());
337 assertState(child, 0, 1, 1);
338 assertState(parent, 0, 1, 1);
339 assertEquals(0, child.arriveAndDeregister());
340 assertTerminated(child, 1);
341 assertTerminated(parent, 1);
342 }
343
344 /**
345 * arriveAndDeregister deregisters one party from its parent when
346 * the number of parties of child is zero after deregistration
347 */
348 public void testArriveAndDeregister4() {
349 Phaser parent = new Phaser();
350 Phaser child = new Phaser(parent);
351 assertEquals(0, parent.register());
352 assertEquals(0, child.register());
353 assertState(child, 0, 1, 1);
354 assertState(parent, 0, 2, 2);
355 assertEquals(0, child.arriveAndDeregister());
356 assertState(child, 0, 0, 0);
357 assertState(parent, 0, 1, 1);
358 }
359
360 /**
361 * arriveAndDeregister deregisters one party from its parent when
362 * the number of parties of root is nonzero after deregistration.
363 */
364 public void testArriveAndDeregister5() {
365 Phaser root = new Phaser();
366 Phaser parent = new Phaser(root);
367 Phaser child = new Phaser(parent);
368 assertState(root, 0, 0, 0);
369 assertState(parent, 0, 0, 0);
370 assertState(child, 0, 0, 0);
371 assertEquals(0, child.register());
372 assertState(root, 0, 1, 1);
373 assertState(parent, 0, 1, 1);
374 assertState(child, 0, 1, 1);
375 assertEquals(0, child.arriveAndDeregister());
376 assertTerminated(child, 1);
377 assertTerminated(parent, 1);
378 assertTerminated(root, 1);
379 }
380
381 /**
382 * arriveAndDeregister returns the phase in which it leaves the
383 * phaser in after deregistration
384 */
385 public void testArriveAndDeregister6() throws InterruptedException {
386 final Phaser phaser = new Phaser(2);
387 Thread t = newStartedThread(new CheckedRunnable() {
388 public void realRun() {
389 assertEquals(0, phaser.arrive());
390 }});
391 assertEquals(1, phaser.arriveAndAwaitAdvance());
392 assertState(phaser, 1, 2, 2);
393 assertEquals(1, phaser.arriveAndDeregister());
394 assertState(phaser, 1, 1, 1);
395 assertEquals(1, phaser.arriveAndDeregister());
396 assertTerminated(phaser, 2);
397 awaitTermination(t, SHORT_DELAY_MS);
398 }
399
400 /**
401 * awaitAdvance succeeds upon advance
402 */
403 public void testAwaitAdvance1() {
404 final Phaser phaser = new Phaser(1);
405 assertEquals(0, phaser.arrive());
406 assertEquals(1, phaser.awaitAdvance(0));
407 }
408
409 /**
410 * awaitAdvance with a negative parameter will return without affecting the
411 * phaser
412 */
413 public void testAwaitAdvance2() {
414 Phaser phaser = new Phaser();
415 assertTrue(phaser.awaitAdvance(-1) < 0);
416 assertState(phaser, 0, 0, 0);
417 }
418
419 /**
420 * awaitAdvance continues waiting if interrupted before waiting
421 */
422 public void testAwaitAdvanceAfterInterrupt() throws InterruptedException {
423 final Phaser phaser = new Phaser();
424 assertEquals(0, phaser.register());
425 final CountDownLatch threadStarted = new CountDownLatch(1);
426
427 Thread t = newStartedThread(new CheckedRunnable() {
428 public void realRun() throws InterruptedException {
429 Thread.currentThread().interrupt();
430 assertEquals(0, phaser.register());
431 assertEquals(0, phaser.arrive());
432 threadStarted.countDown();
433 assertTrue(Thread.currentThread().isInterrupted());
434 assertEquals(1, phaser.awaitAdvance(0));
435 assertTrue(Thread.currentThread().isInterrupted());
436 }});
437
438 assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
439 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
440 assertEquals(0, phaser.arrive());
441 awaitTermination(t, SMALL_DELAY_MS);
442
443 Thread.currentThread().interrupt();
444 assertEquals(1, phaser.awaitAdvance(0));
445 assertTrue(Thread.interrupted());
446 }
447
448 /**
449 * awaitAdvance continues waiting if interrupted while waiting
450 */
451 public void testAwaitAdvanceBeforeInterrupt() throws InterruptedException {
452 final Phaser phaser = new Phaser();
453 assertEquals(0, phaser.register());
454 final CountDownLatch threadStarted = new CountDownLatch(1);
455
456 Thread t = newStartedThread(new CheckedRunnable() {
457 public void realRun() throws InterruptedException {
458 assertEquals(0, phaser.register());
459 assertEquals(0, phaser.arrive());
460 threadStarted.countDown();
461 assertFalse(Thread.currentThread().isInterrupted());
462 assertEquals(1, phaser.awaitAdvance(0));
463 assertTrue(Thread.currentThread().isInterrupted());
464 }});
465
466 assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
467 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
468 t.interrupt();
469 assertEquals(0, phaser.arrive());
470 awaitTermination(t, SMALL_DELAY_MS);
471
472 Thread.currentThread().interrupt();
473 assertEquals(1, phaser.awaitAdvance(0));
474 assertTrue(Thread.interrupted());
475 }
476
477 /**
478 * arriveAndAwaitAdvance continues waiting if interrupted before waiting
479 */
480 public void testArriveAndAwaitAdvanceAfterInterrupt()
481 throws InterruptedException {
482 final Phaser phaser = new Phaser();
483 assertEquals(0, phaser.register());
484 final CountDownLatch threadStarted = new CountDownLatch(1);
485
486 Thread t = newStartedThread(new CheckedRunnable() {
487 public void realRun() throws InterruptedException {
488 Thread.currentThread().interrupt();
489 assertEquals(0, phaser.register());
490 threadStarted.countDown();
491 assertTrue(Thread.currentThread().isInterrupted());
492 assertEquals(1, phaser.arriveAndAwaitAdvance());
493 assertTrue(Thread.currentThread().isInterrupted());
494 }});
495
496 assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
497 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
498 Thread.currentThread().interrupt();
499 assertEquals(1, phaser.arriveAndAwaitAdvance());
500 assertTrue(Thread.interrupted());
501 awaitTermination(t, SMALL_DELAY_MS);
502 }
503
504 /**
505 * arriveAndAwaitAdvance continues waiting if interrupted while waiting
506 */
507 public void testArriveAndAwaitAdvanceBeforeInterrupt()
508 throws InterruptedException {
509 final Phaser phaser = new Phaser();
510 assertEquals(0, phaser.register());
511 final CountDownLatch threadStarted = new CountDownLatch(1);
512
513 Thread t = newStartedThread(new CheckedRunnable() {
514 public void realRun() throws InterruptedException {
515 assertEquals(0, phaser.register());
516 threadStarted.countDown();
517 assertFalse(Thread.currentThread().isInterrupted());
518 assertEquals(1, phaser.arriveAndAwaitAdvance());
519 assertTrue(Thread.currentThread().isInterrupted());
520 }});
521
522 assertTrue(threadStarted.await(SMALL_DELAY_MS, MILLISECONDS));
523 waitForThreadToEnterWaitState(t, SMALL_DELAY_MS);
524 t.interrupt();
525 Thread.currentThread().interrupt();
526 assertEquals(1, phaser.arriveAndAwaitAdvance());
527 assertTrue(Thread.interrupted());
528 awaitTermination(t, SMALL_DELAY_MS);
529 }
530
531 /**
532 * awaitAdvance atomically waits for all parties within the same phase to
533 * complete before continuing
534 */
535 public void testAwaitAdvance4() throws InterruptedException {
536 final Phaser phaser = new Phaser(4);
537 final AtomicInteger count = new AtomicInteger(0);
538 List<Thread> threads = new ArrayList<Thread>();
539 for (int i = 0; i < 4; i++)
540 threads.add(newStartedThread(new CheckedRunnable() {
541 public void realRun() {
542 for (int k = 0; k < 3; k++) {
543 assertEquals(2*k+1, phaser.arriveAndAwaitAdvance());
544 count.incrementAndGet();
545 assertEquals(2*k+1, phaser.arrive());
546 assertEquals(2*k+2, phaser.awaitAdvance(2*k+1));
547 assertEquals(count.get(), 4*(k+1));
548 }}}));
549
550 for (Thread thread : threads)
551 awaitTermination(thread, MEDIUM_DELAY_MS);
552 }
553
554 /**
555 * awaitAdvance returns the current phase
556 */
557 public void testAwaitAdvance5() throws InterruptedException {
558 final Phaser phaser = new Phaser(1);
559 assertEquals(1, phaser.awaitAdvance(phaser.arrive()));
560 assertEquals(1, phaser.getPhase());
561 assertEquals(1, phaser.register());
562 List<Thread> threads = new ArrayList<Thread>();
563 for (int i = 0; i < 8; i++) {
564 final CountDownLatch latch = new CountDownLatch(1);
565 final boolean goesFirst = ((i & 1) == 0);
566 threads.add(newStartedThread(new CheckedRunnable() {
567 public void realRun() throws InterruptedException {
568 if (goesFirst)
569 latch.countDown();
570 else
571 assertTrue(latch.await(SMALL_DELAY_MS, MILLISECONDS));
572 phaser.arrive();
573 }}));
574 if (goesFirst)
575 assertTrue(latch.await(SMALL_DELAY_MS, MILLISECONDS));
576 else
577 latch.countDown();
578 assertEquals(i + 2, phaser.awaitAdvance(phaser.arrive()));
579 assertEquals(i + 2, phaser.getPhase());
580 }
581 for (Thread thread : threads)
582 awaitTermination(thread, SMALL_DELAY_MS);
583 }
584
585 /**
586 * awaitAdvance returns when the phaser is externally terminated
587 */
588 public void testAwaitAdvance6() throws InterruptedException {
589 final Phaser phaser = new Phaser(3);
590 final CountDownLatch threadsStarted = new CountDownLatch(2);
591 final List<Thread> threads = new ArrayList<Thread>();
592 for (int i = 0; i < 2; i++) {
593 Runnable r = new CheckedRunnable() {
594 public void realRun() {
595 assertEquals(0, phaser.arrive());
596 threadsStarted.countDown();
597 assertTrue(phaser.awaitAdvance(0) < 0);
598 assertTrue(phaser.isTerminated());
599 assertTrue(phaser.getPhase() < 0);
600 assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
601 assertEquals(3, phaser.getRegisteredParties());
602 }};
603 threads.add(newStartedThread(r));
604 }
605 threadsStarted.await();
606 phaser.forceTermination();
607 assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
608 for (Thread thread : threads)
609 awaitTermination(thread, SMALL_DELAY_MS);
610 assertTrue(phaser.isTerminated());
611 assertTrue(phaser.getPhase() < 0);
612 assertEquals(3, phaser.getRegisteredParties());
613 }
614
615 /**
616 * arriveAndAwaitAdvance throws IllegalStateException with no
617 * unarrived parties
618 */
619 public void testArriveAndAwaitAdvance1() {
620 try {
621 Phaser phaser = new Phaser();
622 phaser.arriveAndAwaitAdvance();
623 shouldThrow();
624 } catch (IllegalStateException success) {}
625 }
626
627 /**
628 * arriveAndAwaitAdvance waits for all threads to arrive, the
629 * number of arrived parties is the same number that is accounted
630 * for when the main thread awaitsAdvance
631 */
632 public void testArriveAndAwaitAdvance3() throws InterruptedException {
633 final Phaser phaser = new Phaser(1);
634 final int THREADS = 3;
635 final CountDownLatch threadsStarted = new CountDownLatch(THREADS);
636 final List<Thread> threads = new ArrayList<Thread>();
637 for (int i = 0; i < THREADS; i++)
638 threads.add(newStartedThread(new CheckedRunnable() {
639 public void realRun() throws InterruptedException {
640 assertEquals(0, phaser.register());
641 threadsStarted.countDown();
642 assertEquals(1, phaser.arriveAndAwaitAdvance());
643 }}));
644
645 assertTrue(threadsStarted.await(MEDIUM_DELAY_MS, MILLISECONDS));
646 long t0 = System.nanoTime();
647 while (phaser.getArrivedParties() < THREADS)
648 Thread.yield();
649 assertEquals(THREADS, phaser.getArrivedParties());
650 assertTrue(NANOSECONDS.toMillis(System.nanoTime() - t0) < SMALL_DELAY_MS);
651 for (Thread thread : threads)
652 assertTrue(thread.isAlive());
653 assertState(phaser, 0, THREADS + 1, 1);
654 phaser.arriveAndAwaitAdvance();
655 for (Thread thread : threads)
656 awaitTermination(thread, SMALL_DELAY_MS);
657 assertState(phaser, 1, THREADS + 1, THREADS + 1);
658 }
659
660 }