Java 동시 학습의 17 – 스레드 동기화 도구의 CountDownLatch

3922 단어 CountDownLatch
본고는 인터넷상의 글을 배울 때의 총결로 여러분의 사심 없는 공유에 감사드립니다.
CountDownLatch의 매우 전형적인 응용 장면은 다음과 같다. 한 임무가 아래로 내려가려고 하지만 다른 임무가 끝난 후에야 계속 아래로 내려갈 수 있다.만약 우리가 계속 실행하고자 하는 이 임무는 CountDownLatch 대상의await () 방법을 사용하고, 다른 임무는 자신의 임무를 수행한 후에 같은 CountDownLatch 대상의countDown () 방법을 사용합니다. 이 await () 방법을 호출하는 임무는 이 CountDownLatch 대상의 계수치가 0으로 줄어들 때까지 기다리지 않습니다.
package chapter3;

import java.util.concurrent.CountDownLatch;

public class Videoconference implements Runnable{

	private final CountDownLatch controller;
	public Videoconference(int number){
		controller = new CountDownLatch(number);
	}
	
	public void arrive(String name){
		System.out.println(name+" has arrived.");
		controller.countDown();
		System.out.println("VideoConference:Waiting for "+controller.getCount());
	}
	
	@Override
	public void run() {

		System.out.println("VideoConference:Initialization:"+controller.getCount());
		
		try {
			controller.await();
			System.out.printf("VideoConference: All the participants have come
"); System.out.printf("VideoConference: Let's start...
"); } catch (InterruptedException e) { e.printStackTrace(); } } }
package chapter3;

import java.util.concurrent.TimeUnit;

public class Participant implements Runnable{
	private Videoconference conference;
	private String name;
	
	public Participant(Videoconference conference,String name){
		this.conference = conference;
		this.name = name;
		
		
	}
	
	@Override
	public void run() {

		long duration = (long)(Math.random()*10);
		try {
			TimeUnit.SECONDS.sleep(duration);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		conference.arrive(name);
	}

}
package chapter3;
/**
 * 
 * <p>
 * Description: CountDownLatch 
 * </p>
 * @author zhangjunshuai
 * @version 1.0
 * Create Date: 2014-9-25  8:11:55
 * Project Name: Java7Thread
 *
 * <pre>
 * Modification History: 
  *             Date                                Author                   Version          Description 
 * -----------------------------------------------------------------------------------------------------------  
 * LastChange: $Date::             $      $Author: $          $Rev: $         
 * </pre>
 *
 */
public class Main2 {

	/**
	 * <p>
	 * </p>
	 * @author zhangjunshuai
	 * @date 2014-9-25  8:11:50
	 * @param args
	 */
	public static void main(String[] args) {
		Videoconference conference = new Videoconference(9);
		Thread threadConference = new Thread(conference);
		threadConference.start();
		for(int i=0;i<10;i++){
			Participant p = new Participant(conference, "Participant"+i);
			Thread t = new Thread(p);
			t.start();
		}
	}

}

CountDownLatch 클래스에는 세 가지 기본 요소가 있습니다.
초기 값은 CountDownLatch 클래스에서 기다려야 할 이벤트의 수를 결정합니다
await () 방법, 모든 이벤트가 끝날 때까지 기다리는 라인에서 호출됩니다
countDown() 메서드, 이벤트는 실행이 끝난 후 호출됩니다
CountDownLatch 객체를 만들 때 객체는 내부 카운터를 초기화하기 위해 구조 함수의 매개변수를 사용합니다.countDown () 방법을 호출할 때마다 CountDownLatch 대상 내부 카운터가 1씩 감소합니다.내부 카운터가 0이 되면 CountDownLatch 객체는 await() 방법으로 수면하는 모든 스레드를 일깨웁니다.
CountDownLatch 객체의 내부 카운터 값을 초기화하거나 수정할 수는 없습니다.일단 계수기의 값이 시작되면 유일하게 그것을 수정할 수 있는 방법은 이전에 사용했던countDown () 방법이다.계수기가 0에 도달했을 때, 모든 호출 await () 방법은 즉시 되돌아오고, 다음의countDown () 방법의 호출은 아무런 영향을 주지 않습니다.
이 방법은 다른 동기화 방법과 다릅니다.
CountDownLatch 메커니즘은 공유 자원이나 임계 구역을 보호하는 데 사용되지 않습니다.그것은 여러 개의 작업을 동기화하는 데 사용되는 라인입니다.그것은 단지 한 번만 사용할 수 있다.앞서 설명한 바와 같이, Count Down Latch의 계수기가 0에 도달하면, 그 방법에 대한 호출은 무효입니다.다시 동기화하려면 새 대상을 만들어야 합니다.
CountDownLatch 클래스에는 다음과 같은 다른 버전의 await () 방법이 있습니다.
await(long time, Time Unit unit): 이 방법은 중단될 때까지 휴면합니다.CountDownLatch 내부 카운터가 0에 도달하거나 특정한 시간이 지났습니다.Time Unit 클래스는 DAYS, HOURS, MICROSECONDS, MILLISECONDS, MINUTES, NANOSECONDS, SECONDS를 포함하고 있습니다

좋은 웹페이지 즐겨찾기