1.计数器
1.1 CountDownLatch 减法计数器
允许一个或多个线程等待知道其他线程中执行,用来计数的
CountDownLatch ct = new CountDownLatch (6); // 总数是6
for(int i =1; I <+6; I++){
new thread(()->{
sout("输出");
ct.countDown(); // 数量减一
}).start();
}
ct.await(); // 等待计数器归零才会继续往下走
其他代码
1.2 CyclicBarrier 加法计数器
允许一组线程全部等待彼此达到共同屏障点
CyclicBarrier cb = new CyclicBarrier (7, () -> {sout("输出")});
for(int i =1; I <=7; I++){
final int temp = i;
new thread(()->{
sout("输出:" + temp);
cb.await(); // 等待到7个线程的时候,才会执行CyclicBarrier 里面的sout
}).start();
}
2.信号量
Semaphore 信号量作为限流是使用
例子:抢车位(6车3位)
Semaphore sp = new Semaphore (3); // 线程量,即车位数
for(int i =1; I <+6; I++){
new thread(()->{
try(
sp.acquire(); // 得到,假如已满,那它就等待,知道得到的线程中有释放的
sout("抢到车位了");
TimeUnit.SECONDS.sleep(2);
) catch() {
} finally{
sp.release();
}
}).start();
}