这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
CyclicBarrier
juc包下的CyclicBarrier类使用于例如人到齐了才能开会这种场景,它可以实现让一组线程相互等待,直到到达某个屏障点后才继续向下进行。
看下CyclicBarrier常用的构造器
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
-
parties 表示的是参与线程的个数
-
barrierAction 表示这些线程达到条件后执行的任务。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("集齐七颗龙珠召唤神龙");
});
for (int i = 1; i <=7; i++) {
final int num = i;
new Thread(()->{
System.out.println("收集到第"+num+"颗龙珠");
try { cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); }
}).start();
}
}
}
收集到第1颗龙珠
收集到第4颗龙珠
收集到第3颗龙珠
收集到第2颗龙珠
收集到第6颗龙珠
收集到第5颗龙珠
收集到第7颗龙珠
集齐七颗龙珠召唤神龙
Semaphore
Semaphore是JDK提供的一个同步工具,它通过维护若干个许可证来控制线程对共享资源的访问。
public Semaphore(int permits) {
sync = new NonfairSync(permits);
}
来看下构造方法,其中permits就是许可证的数量,每次线程需要访问资源就从Semaphore中拿许可证,Semaphore中许可证数量-1,如果没有许可证线程就阻塞,并且线程访问完资源后会归还这个许可证,Semphore中许可证数量+1。 Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量。
常用的有acquire和release方法
- acquire 调用该方法时线程会被阻塞,直到获取到许可证
- release 向Semaphore中添加一个许可证,如果有线程因为获取许可证而阻塞,那么它将获取到这个许可证,否则只是增加了Semaphore中许可证的数量 这边模拟有三个车位,6辆车进出车位的过程。
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(1);
System.out.println(Thread.currentThread().getName()+"释放车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release(); //释放车位
}
},String.valueOf(i)).start();
}
}
}
运行结果:
1抢到车位
3抢到车位
2抢到车位
1释放车位
2释放车位
3释放车位
5抢到车位
4抢到车位
6抢到车位
4释放车位
5释放车位
6释放车位