常用辅助类
CountDownLatch
官方文档解释
//允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
//A CountDownLatch用给定的计数初始化。 await方法阻塞,直到由于调用countDown()方法,当前计数达到零,此后所有等待线程被释放,并且任何后续的调用await立即返回。 这是一个一次性的现象 - 计数无法重置。
package com.luoKing.aid;
import java.util.concurrent.CountDownLatch;
//计数器
public class countDownLatch {
public static void main(String[] args) throws InterruptedException {
// 必须要执行任务的时候再使用
CountDownLatch countDownLatch = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+" go out ");
countDownLatch.countDown();//数量减1
},String.valueOf(i)).start();
}
countDownLatch.await();//等待计数器归零,向下执行代码
System.out.println("关门");
}
}
如果没有 countDownLatch.await()方法,由于System.out.println("关门");没有锁的束缚,会先执行,
但我们需要先执行多线程中的方法后,再输出“关门”,所以countDownlatch类起到一个计时阻塞的作用
CyclicBarrier
package com.luoKing.aid;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
//加法器
public class CyclicBarrierDemo {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙");
});//parties必须要大于1,当线程到达parties时,会执行线程System.out.println("召唤神龙");,如果没有达到就会发生阻塞
for (int i = 1; i <= 7; i++) {
final int temp = i;
new Thread(()->{
System.out.println("集齐了"+temp+"颗龙珠");
try {
cyclicBarrier.await();//计数等待
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
semaphore
package com.luoKing.aid;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
//信号量,主要用于限流(限制线程的数量)、多个资源互斥的使用
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();
}
}
}