자바 자물쇠 의 Cyclic Barrier (서로 기다 리 며 모두 가 다 할 때 까지 함께 아래 를 시작 합 니 다)
참고 글:http://blog.csdn.net/lmc_wy / article / details / 7866863 (폐쇄 Count Downlatch 와 울타리 Cyclic Barrier)
모든 스 레 드 는 모두 가 수평선 에 도착 할 때 까지 서로 기다 리 고 있 습 니 다. 모두 가 계속 운행 하고 있 습 니 다. 이 수평선 은 바로 울타리 입 니 다.
울타리: 공공 장벽 에 도달 할 때 까지 동기 화 보조 클래스 입 니 다.울 타 리 를 이용 하면 모든 스 레 드 가 어느 지점 에 도착 할 때 까지 스 레 드 를 서로 기다 릴 수 있 습 니 다. 그리고 울타리 가 열 리 고 모든 스 레 드 는 울 타 리 를 통 해 계속 실 행 됩 니 다.CyclicBarrier 는 선택 할 수 있 는
Runnable
인 자 를 지원 합 니 다. 스 레 드 가 울 타 리 를 통과 할 때 runnable 대상 이 호출 됩 니 다.구조 함수 CyclicBarrier(int parties, Runnable barrierAction)
는 Cyclic Barrier 대상 에서 스 레 드 await()
방법 을 호출 할 때 울타리 의 계수 기 는 1 이 증가 하고 카운터 가 parties
일 때 울타리 가 열 립 니 다.import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
final int count = 5;
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {
@Override
public void run() {
System.out.println(" !");
}
});
for (int i = 0; i < count; i++) {
new Thread(new Worker(i, barrier)).start();
}
}
}
class Worker implements Runnable {
final int id;
final CyclicBarrier barrier;
public Worker(final int id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(this.id + "starts to run !");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(this.id + "arrived !");
this.barrier.await(); //
System.out.println(this.id+"--end--time:{"+System.currentTimeMillis()+"}");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
실행 결과:
0starts to run !
1starts to run !
2starts to run !
3starts to run !
4starts to run !
1arrived !
4arrived !
3arrived !
0arrived !
2arrived !
!
2--end--time:{1469688224243}
1--end--time:{1469688224243}
3--end--time:{1469688224243}
4--end--time:{1469688224243}
0--end--time:{1469688224243}
다시 한 번 예 를 들 어 스 레 드 탱크 에서 5 개의 스 레 드 를 가 져 옵 니 다. 이 스 레 드 가 시 작 된 후에 한 가지 일 을 동시에 합 니 다. Cyclic Barrier 로 이 루어 집 니 다.
public static void main(String[] args) {
final CyclicBarrier barrier=new CyclicBarrier(5);
ExecutorService service= Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
service.execute(new Runnable() {
@Override
public void run() {
try {
long wait=(long)(Math.random()*10000);
System.out.println(wait);
Thread.sleep(wait); //
barrier.await(); //
System.out.println("start time :"+System.currentTimeMillis()); //
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.