1.CountDownLatch递减计数器
public class CountDownLatchDemo {
public static void main(String[] args) throws Exception {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 1; i <= 6; i++) {
new Thread(( ) -> {
try {
if (Thread.currentThread( ).getName( ).equals("同学6")) {
Thread.sleep(2000);
}
System.out.println(Thread.currentThread( ).getName( ) + "离开了");
countDownLatch.countDown( );
} catch (Exception e) {
e.printStackTrace( );
}
}, "同学" + i).start( );
}
countDownLatch.await( );
System.out.println("全部离开了,现在的计数器为" + countDownLatch.getCount( ));
}
}
2.CyclicBarrier循环栏珊
public class CyclicBarrierDemo {
private static int SIZE = 5;
private static CyclicBarrier cb;
public static void main(String[] args) {
cb = new CyclicBarrier(SIZE);
for (int i = 0; i < SIZE; i++) {
new MyTask().start();
}
}
static class MyTask extends Thread {
@Override
public void run() {
try {
System.out.println("线程" + Thread.currentThread().getName() + "正在执行同一个任务");
Thread.sleep(1000);
System.out.println("线程" + Thread.currentThread().getName() + "执行任务完成,等待其他线程执行完毕");
cb.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("所有线程写入完毕");
}
}
}
3.Semaphore信号量
public class SemaphoreDemo {
public static void main(String[] args) throws Exception {
Semaphore semaphore = new Semaphore(3);
for (int i = 1; i <= 6; i++) {
Thread.sleep(100);
new Thread(( ) -> {
try {
System.out.println(Thread.currentThread( ).getName( ) + "找车位 ing");
semaphore.acquire( );
System.out.println(Thread.currentThread( ).getName( ) + "汽车停车成功!");
Thread.sleep(10000L);
} catch (Exception e) {
e.printStackTrace( );
} finally {
System.out.println(Thread.currentThread( ).getName( ) + "溜了溜了");
semaphore.release( );
}
}, "汽车" + i).start( );
}
}
}