JUC 常用辅助类
JUC 常用辅助类
CountDownLatch减少计数
public class CountDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch cd = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t号同学离开教室");
cd.countDown();
},String.valueOf(i)).start();
}
cd.await();
System.out.println(
Thread.currentThread().getName()+"\t班长离开教室"
);
}
}
CountDownLatch在初始化时传入一个数值,通过cd.countDown()可以将数值减去1,当数值减少到0时,cd.await()阻塞的线程就可以被释放。
CyclicBarrier循环栅栏
集齐龙珠召唤神龙
public class CylicDemo {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙");
});
for (int i = 0; i < 7; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+
"\t号龙珠收集成功");
try {
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
},String.valueOf(i)).start();
}
}
}
在新建CyclicBarrier对象时可以传入一定的事务和等待的事务个数,当其他线程 barrier.await()被阻塞后,等待的事务个数减少1,当等待的事务减少为0时,主要事务执行。其他被阻塞的事务也就接着一起执行。
Semaphore信号灯
YY抢麦
public class SemphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"\t车进入车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"\t车驶出车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
可以通过Semaphore来建立相应数量的资源来进行争抢,通过semaphore.acquire(); semaphore.release();来抢占和释放资源。可以用于多个共享资源的互斥使用,并发线程数量的控制