1.减计数器-CountDownLatch
- 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(20);
for (int i=1 ;i<=20;i++){
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName()+">="+countDownLatch.getCount());
}
System.out.println("我可以在Await方法之前执行");
countDownLatch.await();
System.out.println("我为什么在最后执行呢");
}
}
2.加计数器-CyclicBarrier
public class CyclicBarrierDemo {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7,()->{
System.out.println("舍利子集齐成功,如来重生");
});
for (int i=1;i<=7;i++){
int finalI = i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+":收集了"+ finalI +"颗");
try {
cyclicBarrier.await();
System.out.println("无天必须在如来重生之后,再死");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
3.Semaphore
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i=1;i<=6;i++){
new Thread(() -> {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"抢到了车位");
TimeUnit.SECONDS.sleep(2);
System.out.println(Thread.currentThread().getName()+"离开了车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}