자바 자물쇠 의 Cyclic Barrier (서로 기다 리 며 모두 가 다 할 때 까지 함께 아래 를 시작 합 니 다)

3754 단어
더 읽 기
참고 글: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();
					}
				}
			});
	    }
	    }

좋은 웹페이지 즐겨찾기