核心方法 dowait
1, 等generation被打破之后 再有线程调用dowait方法时会直接 抛出BrokenBarrierException
2. 在调用dowait方法时线程被中断也会 打断generation 并唤醒所有在这一代挂起的线程 当前线程抛出 InterruptedException
3. count-- 如果不为0就进入自旋使用condition.await挂起
4. 当最后一个线程执行dowait方法 是的count-- 后等于0 如果构造参数传入了任务,这里会执行任务 如果在任务执行过程中发生了异常也会打破当前代并唤醒挂起的线程
4.2 正常情况下会唤醒挂起的线程然后开启新的一代 当前线程返回0
5. 其他挂起的线程正常情况下也会依次返回0
5.2 在被唤醒之后如果代被打破会抛出异常 BrokenBarrierException
5.3 在条件队列被中断唤醒 被中断的线程这时会打破这一代并唤醒 其他线程返回中断状态
5.4 超时被唤醒的线程会打破这一代 并抛出TimeoutException 异常