今天时间学习CyclicBarrier api,该类是JUC原子包中的类,通过单元测试代码把所有public api方法跑了一遍,大致了解了底层实现,初学乍练,有很多一知半解的地方,待后续有了深入理解再来补充
package test.java.util.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import org.junit.Test;
/**
* CyclicBarrier的测试类
*
* @date 2020-07-14 18:50:38
*/
public class CyclicBarrierTest {
class RunnableTest implements Runnable{
private CyclicBarrier barrier;
RunnableTest(CyclicBarrier barrier){
this.barrier=barrier;
}
@Override
public void run() {
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" finished");
}
}
class RunnableTest1 implements Runnable{
private CyclicBarrier barrier;
RunnableTest1(CyclicBarrier barrier){
this.barrier=barrier;
}
@Override
public void run() {
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" finished");
}
}
class RunnableTest2 implements Runnable{
private CyclicBarrier barrier;
RunnableTest2(CyclicBarrier barrier){
this.barrier=barrier;
}
@Override
public void run() {
try {
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" finished");
}
}
class RunnableTest3 implements Runnable{
RunnableTest3(){
}
@Override
public void run() {
System.out.println("first "+Thread.currentThread().getName()+" finished");
}
}
/**
* 在barrier等待过程中,RunnableTest3优先执行,如果其他三个线程都到达即执行三个线程
* @Param
*/
@Test
public void testConstruct0()throws Exception{
RunnableTest3 runnableTest3=new RunnableTest3();
CyclicBarrier testObj=new CyclicBarrier(3,runnableTest3);
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
}
/**
*在barrier等待过程中,如果其他三个线程都到达即执行三个线程
* @Param
*/
@Test
public void testConstruct1()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3);
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
}
/**
* 获取需要等待的线程数
* @Param
*/
@Test
public void testGetParties()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
System.out.println(testObj.getParties());
}
/**
* 等待,直到所有线程都到达
* @Param
*/
@Test
public void testAwait1()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
System.out.println(testObj.getParties());
}
/**
*等待指定时间,时间到立即执行
* @Param
*/
@Test
public void testAwait()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
}
/**
* 是否是broken 状态,默认false
* @Param
*/
@Test
public void testIsBroken()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
System.out.println(testObj.isBroken());
}
/**
* 重置线程屏障
* @Param
*/
@Test
public void testReset()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
System.out.println(testObj.getNumberWaiting());
testObj.reset();
System.out.println(testObj.getNumberWaiting());
}
/**
* 获取等待的线程数
* @Param
*/
@Test
public void testGetNumberWaiting()throws Exception{
CyclicBarrier testObj=new CyclicBarrier(3,new RunnableTest3());
RunnableTest test=new RunnableTest(testObj);
RunnableTest1 test1=new RunnableTest1(testObj);
RunnableTest2 test2=new RunnableTest2(testObj);
new Thread(test).start();
new Thread(test1).start();
new Thread(test2).start();
System.out.println(testObj.getNumberWaiting());
testObj.reset();
System.out.println(testObj.getNumberWaiting());
}
}