18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/* 28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166 38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at 48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/ 58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes, 68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd. 78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166; 108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport junit.framework.*; 128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.*; 138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BrokenBarrierException; 148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch; 158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CyclicBarrier; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException; 178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicBoolean; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class CyclicBarrierTest extends JSR166TestCase { 218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private volatile int countAction; 238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private class MyAction implements Runnable { 248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void run() { ++countAction; } 258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Spin-waits till the number of waiters == numberOfWaiters. 298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void awaitNumberWaiting(CyclicBarrier barrier, int numberOfWaiters) { 318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (barrier.getNumberWaiting() != numberOfWaiters) { 338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (millisElapsedSince(startTime) > LONG_DELAY_MS) 348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle fail("timed out"); 358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.yield(); 368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Creating with negative parties throws IAE 418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor1() { 438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new CyclicBarrier(-1, (Runnable)null); 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Creating with negative parties and no action throws IAE 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testConstructor2() { 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new CyclicBarrier(-1); 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (IllegalArgumentException success) {} 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getParties returns the number of parties given in constructor 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetParties() { 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CyclicBarrier b = new CyclicBarrier(2); 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, b.getParties()); 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, b.getNumberWaiting()); 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A 1-party barrier triggers after single await 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSingleParty() throws Exception { 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CyclicBarrier b = new CyclicBarrier(1); 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, b.getParties()); 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, b.getNumberWaiting()); 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, b.getNumberWaiting()); 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * The supplied barrier action is run at barrier 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testBarrierAction() throws Exception { 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle countAction = 0; 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle CyclicBarrier b = new CyclicBarrier(1, new MyAction()); 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(1, b.getParties()); 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, b.getNumberWaiting()); 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, b.getNumberWaiting()); 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(2, countAction); 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A 2-party/thread barrier triggers after both threads invoke await 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTwoParties() throws Exception { 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier b = new CyclicBarrier(2); 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle b.await(); 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * An interruption in one party causes others waiting in await to 1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throw BrokenBarrierException 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwait1_Interrupted_BrokenBarrier() { 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(2); 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = new ThreadShouldThrow(InterruptedException.class) { 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) { 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.start(); 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.start(); 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.interrupt(); 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * An interruption in one party causes others waiting in timed await to 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throw BrokenBarrierException 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwait2_Interrupted_BrokenBarrier() throws Exception { 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseInterrupt = new CountDownLatch(2); 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = new ThreadShouldThrow(InterruptedException.class) { 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(LONG_DELAY_MS, MILLISECONDS); 1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) { 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseInterrupt.countDown(); 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(LONG_DELAY_MS, MILLISECONDS); 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.start(); 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.start(); 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseInterrupt); 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.interrupt(); 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A timeout in timed await throws TimeoutException 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwait3_TimeoutException() throws InterruptedException { 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(2); 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(timeoutMillis(), MILLISECONDS); 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (TimeoutException success) {} 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A timeout in one party causes others waiting in timed await to 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throw BrokenBarrierException 1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwait4_Timeout_BrokenBarrier() throws InterruptedException { 1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(LONG_DELAY_MS, MILLISECONDS); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (BrokenBarrierException success) {} 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitNumberWaiting(c, 1); 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(timeoutMillis(), MILLISECONDS); 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (TimeoutException success) {} 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A timeout in one party causes others waiting in await to 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * throw BrokenBarrierException 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAwait5_Timeout_BrokenBarrier() throws InterruptedException { 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (BrokenBarrierException success) {} 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitNumberWaiting(c, 1); 2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(timeoutMillis(), MILLISECONDS); 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (TimeoutException success) {} 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A reset of an active barrier causes waiting threads to throw 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * BrokenBarrierException 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testReset_BrokenBarrier() throws InterruptedException { 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CountDownLatch pleaseReset = new CountDownLatch(2); 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) { 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseReset.countDown(); 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) { 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle pleaseReset.countDown(); 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.start(); 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.start(); 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle await(pleaseReset); 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitNumberWaiting(c, 2); 2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.reset(); 2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * A reset before threads enter barrier does not throw 2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * BrokenBarrierException 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testReset_NoBrokenBarrier() throws Exception { 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(3); 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.reset(); 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * All threads block while a barrier is broken. 2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testReset_Leakage() throws InterruptedException { 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier c = new CyclicBarrier(2); 2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final AtomicBoolean done = new AtomicBoolean(); 2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t = newStartedThread(new CheckedRunnable() { 2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() { 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (!done.get()) { 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle while (c.isBroken()) 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.reset(); 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle c.await(); 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle catch (BrokenBarrierException ok) {} 3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle catch (InterruptedException ok) {} 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}}); 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 4; i++) { 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle delay(timeoutMillis()); 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle done.set(true); 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t.interrupt(); 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t); 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Reset of a non-broken barrier does not break barrier 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testResetWithoutBreakage() throws Exception { 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier barrier = new CyclicBarrier(3); 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 3; i++) { 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier start = new CyclicBarrier(3); 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(barrier.isBroken()); 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (i == 1) barrier.reset(); 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(barrier.isBroken()); 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Reset of a barrier after interruption reinitializes it. 3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testResetAfterInterrupt() throws Exception { 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier barrier = new CyclicBarrier(3); 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; i++) { 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier start = new CyclicBarrier(3); 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = new ThreadShouldThrow(InterruptedException.class) { 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) { 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.start(); 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.start(); 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.interrupt(); 3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(barrier.isBroken()); 3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.reset(); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(barrier.isBroken()); 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Reset of a barrier after timeout reinitializes it. 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testResetAfterTimeout() throws Exception { 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier barrier = new CyclicBarrier(3); 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; i++) { 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = newStartedThread(new CheckedRunnable() { 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (BrokenBarrierException success) {} 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = newStartedThread(new CheckedRunnable() { 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitNumberWaiting(barrier, 1); 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle long startTime = System.nanoTime(); 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(timeoutMillis(), MILLISECONDS); 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (TimeoutException success) {} 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(millisElapsedSince(startTime) >= timeoutMillis()); 4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}); 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(barrier.isBroken()); 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.reset(); 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(barrier.isBroken()); 4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Reset of a barrier after a failed command reinitializes it. 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testResetAfterCommandException() throws Exception { 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier barrier = 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle new CyclicBarrier(3, new Runnable() { 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void run() { 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle throw new NullPointerException(); }}); 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (int i = 0; i < 2; i++) { 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final CyclicBarrier start = new CyclicBarrier(3); 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) { 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) { 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void realRun() throws Exception { 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t1.start(); 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle t2.start(); 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle start.await(); 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitNumberWaiting(barrier, 2); 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.await(); 4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t1); 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle awaitTermination(t2); 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(barrier.isBroken()); 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle barrier.reset(); 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(barrier.isBroken()); 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, barrier.getNumberWaiting()); 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 459