public class CountDownLatchFunc1 implements Runnable {
public CountDownLatch c;
public CountDownLatchFunc1(CountDownLatch c) {
this.c = c;
}
@Override
public void run() {
c.countDown();
System.out.println(Thread.currentThread().getName()+"==============>>ok"+c.getCount());
}
public static void main(String[] args) throws InterruptedException {
CountDownLatch c = new CountDownLatch(6);
CountDownLatchFunc2 c2=new CountDownLatchFunc2();
CountDownLatchFunc1 c1=new CountDownLatchFunc1(c);
for (int i = 0 ;i<10;i++){
Thread t = new Thread(c1);
c.getCount();//获取当前调度的线程值
t.start();
}
//:理解,达不到条件的时候,wait下面的线程属于阻塞线程,同理,其余的线程调度不会出现在0以上
c.await();
Thread t2 = new Thread(c2,"线程3");
t2.start();
System.out.println("执行主线程");
}
内部类Sync同样继承AQS;
AQS的state代表count;
初始化使用计数器count;
count代表多个线程执行或者某个操作执行次数;
countDown()方法将会将count-1;
count为0将会释放所有等待线程;
await方法将会阻塞直到count为0;
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。
count不为0,但是等待时间过去将会返回false。
中断情况:
如果当前计数大于零,则出于线程调度目的,当前线程将禁用,并处于休眠状态,直到发生以下三种情况之一:
1.countDown方法调用导致count减数为0;
2.别的线程中断了当前线程
3.指定等待时间过去
CyclicBarrier:
简单理解:调用await让线程进入等待序列,如果达到指定的值的适合,在执行所有等待中线程
public CyclicBarrier c; public CyclicBarrierFunc1(CyclicBarrier c) { this.c = c; } @Override public void run() { try { System.out.println(Thread.currentThread().getName()+"开始等待"); c.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"==============>>ok,结束等待"); }
public static void main(String[] args) throws InterruptedException { CyclicBarrier c=new CyclicBarrier(2); CyclicBarrierFunc1 c1=new CyclicBarrierFunc1(c); for (int i = 0;i<10;i++) { Thread t1 = new Thread(c1, "一线程"+i); Thread.sleep(1000); t1.start(); } }
执行效果:
一线程0开始等待
一线程1开始等待
一线程1==============>>ok,结束等待
一线程0==============>>ok,结束等待
一线程2开始等待
一线程3开始等待
一线程3==============>>ok,结束等待
一线程2==============>>ok,结束等待
一线程4开始等待
一线程5开始等待
一线程5==============>>ok,结束等待
一线程4==============>>ok,结束等待