循環(huán)柵欄啄刹,什么時(shí)候人滿了就把柵欄推到刻盐,都放出去浪讳,出去之后柵欄又重新起來拗小,再等人滿了,再放開姆打。
比如有一個(gè)復(fù)雜的操作亭病,需要訪問數(shù)據(jù)庫逻恐,需要訪問網(wǎng)絡(luò),需要訪問文件堕汞,有一種方式是可以順序執(zhí)行勺爱,但這樣效率太低了,另外可以并發(fā)執(zhí)行讯检,一個(gè)線程去訪問數(shù)據(jù)庫琐鲁,一個(gè)線程訪問網(wǎng)絡(luò),一個(gè)線程訪問文件人灼,等三個(gè)線程都執(zhí)行完之后再做后續(xù)操作围段。這個(gè)時(shí)候就可以用CyclicBarrier。
public class Study07 {
????public static void main(String[] args) {
????????CyclicBarrier barrier =new CyclicBarrier(3, () -> {
????????????System.out.println("執(zhí)行后續(xù)操作");
? ? ? ? });
? ? ? ? new Thread(()->{
????????????System.out.println("訪問數(shù)據(jù)庫...");
? ? ? ? ? ? try {
????????????????barrier.await();
? ? ? ? ? ? }catch (InterruptedException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }catch (BrokenBarrierException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }
????????}).start();
? ? ? ? new Thread(()->{
????????????System.out.println("訪問網(wǎng)絡(luò)...");
? ? ? ? ? ? try {
????????????????barrier.await();
? ? ? ? ? ? }catch (InterruptedException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }catch (BrokenBarrierException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }
????????}).start();
? ? ? ? new Thread(()->{
????????????System.out.println("訪問文件...");
? ? ? ? ? ? try {
????????????????barrier.await();
? ? ? ? ? ? }catch (InterruptedException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }catch (BrokenBarrierException e) {
????????????????e.printStackTrace();
? ? ? ? ? ? }
????????}).start();
? ? }
}
執(zhí)行結(jié)果:
訪問數(shù)據(jù)庫...
訪問網(wǎng)絡(luò)...
訪問文件...
執(zhí)行后續(xù)操作