JUC并发包下三个多线程并发基类
1.CountDownLatch(计数器):等待其他线程执行完毕在执行当前线程
CountDownLatch主要有两个方法,当一个或多个线程
调用await()方法时,调用线程会被阻塞
,其他线程调用countDown()方法计数器减1(调用countDown方法时线程不会阻塞)
,当计数器的值变为0,因调用await方法被阻塞的线程会被唤醒,继续执行
public class CountDownLatchTest {
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(3);
for(int i=0; i<3; i++){
int temp = i;
new Thread(()->{
System.out.println("第"+temp+"同学进教室了");
countDownLatch.countDown();
}).start();
}
try {
countDownLatch.await();
System.out.println("同学们都到到齐了,开始上课");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
.
2.CyclicBarrier:循环栅栏
CyclicBarrier的字面意思是可循环使用的屏障。
它要做的事情是让一组线程到达一个屏障之后时会被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法
public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Thread(()-> System.out.println("宝石集齐了")));
for(int i=0; i<5; i++){
int temp =i;
new Thread(()->{
System.out.println("收集到第"+temp+"宝石");
try {
cyclicBarrier.await();
System.out.println(temp+"进化");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
运行结果:
.
3.Semaphore(信号量)
号量的使用目的:
1)共享资源的相互排斥;
2)并发资源数的控制 Semaphore具有“伸缩性”,就是资源用完了释放后还可以继续用
调用方法semaphore.acquire(), semaphore.release()
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
for(int i =0; i<6; i++){
int temp = i;
new Thread(()->{
try {
semaphore.acquire();
System.out.println("第"+temp+"号车停进来了");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("第"+temp+"号车开出去了");
semaphore.release();
}
}).start();
}
}
}
运行结果: