--- jsr166/src/test/tck/CyclicBarrierTest.java 2011/05/28 14:52:11 1.21 +++ jsr166/src/test/tck/CyclicBarrierTest.java 2017/05/29 22:44:26 1.29 @@ -6,28 +6,40 @@ * Pat Fisher, Mike Judd. */ -import junit.framework.*; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.locks.*; -import java.util.concurrent.atomic.*; import static java.util.concurrent.TimeUnit.MILLISECONDS; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import junit.framework.Test; +import junit.framework.TestSuite; + public class CyclicBarrierTest extends JSR166TestCase { public static void main(String[] args) { - junit.textui.TestRunner.run(suite()); + main(suite(), args); } public static Test suite() { return new TestSuite(CyclicBarrierTest.class); } - private volatile int countAction; - private class MyAction implements Runnable { - public void run() { ++countAction; } + /** + * Spin-waits till the number of waiters == numberOfWaiters. + */ + void awaitNumberWaiting(CyclicBarrier barrier, int numberOfWaiters) { + long startTime = System.nanoTime(); + while (barrier.getNumberWaiting() != numberOfWaiters) { + if (millisElapsedSince(startTime) > LONG_DELAY_MS) + fail("timed out"); + Thread.yield(); + } } /** - * Creating with negative parties throws IAE + * Creating with negative parties throws IllegalArgumentException */ public void testConstructor1() { try { @@ -37,7 +49,8 @@ public class CyclicBarrierTest extends J } /** - * Creating with negative parties and no action throws IAE + * Creating with negative parties and no action throws + * IllegalArgumentException */ public void testConstructor2() { try { @@ -71,14 +84,16 @@ public class CyclicBarrierTest extends J * The supplied barrier action is run at barrier */ public void testBarrierAction() throws Exception { - countAction = 0; - CyclicBarrier b = new CyclicBarrier(1, new MyAction()); + final AtomicInteger count = new AtomicInteger(0); + final Runnable incCount = new Runnable() { public void run() { + count.getAndIncrement(); }}; + CyclicBarrier b = new CyclicBarrier(1, incCount); assertEquals(1, b.getParties()); assertEquals(0, b.getNumberWaiting()); b.await(); b.await(); assertEquals(0, b.getNumberWaiting()); - assertEquals(countAction, 2); + assertEquals(2, count.get()); } /** @@ -186,8 +201,7 @@ public class CyclicBarrierTest extends J }}); Thread t2 = newStartedThread(new CheckedRunnable() { public void realRun() throws Exception { - while (c.getNumberWaiting() == 0) - Thread.yield(); + awaitNumberWaiting(c, 1); long startTime = System.nanoTime(); try { c.await(timeoutMillis(), MILLISECONDS); @@ -215,8 +229,7 @@ public class CyclicBarrierTest extends J }}); Thread t2 = newStartedThread(new CheckedRunnable() { public void realRun() throws Exception { - while (c.getNumberWaiting() == 0) - Thread.yield(); + awaitNumberWaiting(c, 1); long startTime = System.nanoTime(); try { c.await(timeoutMillis(), MILLISECONDS); @@ -250,6 +263,8 @@ public class CyclicBarrierTest extends J t1.start(); t2.start(); await(pleaseReset); + + awaitNumberWaiting(c, 2); c.reset(); awaitTermination(t1); awaitTermination(t2); @@ -386,8 +401,7 @@ public class CyclicBarrierTest extends J }}); Thread t2 = newStartedThread(new CheckedRunnable() { public void realRun() throws Exception { - while (barrier.getNumberWaiting() == 0) - Thread.yield(); + awaitNumberWaiting(barrier, 1); long startTime = System.nanoTime(); try { barrier.await(timeoutMillis(), MILLISECONDS); @@ -432,7 +446,7 @@ public class CyclicBarrierTest extends J t1.start(); t2.start(); start.await(); - while (barrier.getNumberWaiting() < 2) { Thread.yield(); } + awaitNumberWaiting(barrier, 2); try { barrier.await(); shouldThrow();