[자바 병렬 프로그래밍 실전] 독서노트(1): 폐쇄

잠금(Latch)
폐쇄(Latch): 종료 상태가 될 때까지 스레드의 진행을 지연시키는 동기화 도구 클래스입니다.그 작용은 한 개의 문에 해당한다. 이 문이 열리기 전에 모든 라인이 문 앞에 막히고 문이 열리면 모든 라인이 통과할 수 있다.또한 문(폐쇄)의 상태는 일회성(울타리는 제어)으로 문이 열리면 다시 닫을 수 없다.폐쇄는 어떤 활동이 다른 활동이 끝난 후에야 계속 실행될 수 있도록 확보하는 데 쓸 수 있다.
 
CountDownLatch는java입니다.util.concurrent 패키지는 다음과 같은 API와 함께 폐쇄의 구현에 대해 설명합니다.
public CountDownLatch(int count)
//현재 스레드를 잠금 메모리가 0까지 카운트다운되기 전까지 기다립니다. 스레드가 중단되지 않는 한
public void await() throws InterruptedException
//현재 스레드가 잠금 메모리에서 0까지 카운트다운되기 전에 스레드가 중단되거나 지정한 대기 시간을 초과하지 않는 한 계속 기다립니다. 
public boolean await(long timeout, TimeUnit unit) throws InterruptedException
//카운트다운
public void countDown()
//현재 카운트 반환
public long getCount() 
 
위 코드(JCIP5-5 + 메모 및 main():
 
/**
 * TestHarness Using CountDownLatch for starting and stopping threads in timing
 * tests
 * 
 * @author Brian Goetz and Tim Peierls
 * @author Modified by alchimie
 */
public class TestHarness {
	public long timeTasks(int nThreads, final Runnable task)
			throws InterruptedException {
		//    
		final CountDownLatch startGate = new CountDownLatch(1);
		//    
		final CountDownLatch endGate = new CountDownLatch(nThreads);

		for (int i = 0; i < nThreads; i++) {
			Thread t = new Thread() {
				public void run() {
					try {
						System.out.println("  "
								+ Thread.currentThread().getName() + "    ");
						//         
						startGate.await();
						try {
							task.run();
						} finally {
							endGate.countDown();
						}
					} catch (InterruptedException ignored) {
					}
				}
			};
			t.start();
		}

		long start = System.nanoTime();
		//                 
		Thread.sleep(100);
		startGate.countDown();
		System.out.println("  " + Thread.currentThread().getName() + "  ");
		//               
		endGate.await();
		System.out.println("  " + Thread.currentThread().getName() + "  ");
		long end = System.nanoTime();
		return end - start;
	}

	public static void main(String args[]) {
		TestHarness th = new TestHarness();
		try {
			long time = th.timeTasks(5, new Thread(new Runnable() {
				public void run() {
					System.out.println("  " + Thread.currentThread().getName()
							+ "    ");
				}
			}));
			System.out.println("    " + time);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 
 
실행 결과:
스레드 Thread-1 실행 대기
스레드 Thread-4 실행 대기
스레드 Thread-3 실행 대기
스레드 Thread-2 실행 대기
스레드 Thread-5 실행 대기
스레드main 대기
스레드 Thread-1 실행 완료
Thread-5 스레드 실행 완료
Thread-2 스레드 실행 완료
Thread-3 스레드 실행 완료
Thread-4 스레드 실행 완료
스레드main 실행
통계 시간 100455504

좋은 웹페이지 즐겨찾기