반응형

 

CountDownLatch 일반화 그림

 

일반적인 스레드 join

package CountDownLatch;

public class CountDownLatch {
	public static void main(String[] args) {
		Thread thread = new Thread() {
			@Override
			public void run() {
				System.out.println("Thread Start");
				int sum = 0;
				for(int i = 0 ; i < 10000000;i ++) {
					sum++;
				}
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("sum :: " + sum);
			}
		};
		
		thread.start();
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Thread Finish");
	}
}

보통 여러 스레드를 만들어 join을 하거나 이런식으로 join을 하여 main 스레드를 제어하지만,

멀티 스레드 상태에서 join을 이용하면 불편한 상황들이 생긴다.

 

즉, join을 하면 메인과는 동기화를 할 수 있지만 각 스레드를 동시에 시작시키거나 할 순 없다.

 

세마포어도 마찬가지다. 10개의 semaphore를 할당해도 스레드 10개를 모두 다 만든 뒤 동시에 실행하지는 못한다.

 

세마포어

package CountDownLatch;

import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicInteger;

public class CountDownLatch {
	public static void main(String[] args) {
		AtomicInteger ordinal = new AtomicInteger(0);
		final Semaphore sem = new Semaphore(10);
		for (int i = 0; i < 10; ++ i)
		{
		  Thread thread = new Thread() {
		  	@Override
		    public void run() {
		  		try {
		  			sem.acquire();
		  		} catch (InterruptedException e) {
		  			e.printStackTrace();
		  		}
		  		
		      try {
		      	ordinal.getAndIncrement();
		      } finally {
		      	System.out.println("finish!" + ordinal.get());
		        sem.release();
		      }  		
		    }
		  };
		  thread.start();
		}

	}
}

 

 

하지만 CountDownLatch는 그것을 가능하게 한다.

 

그래서 CountDownLatch를 병렬 프로그래밍에 쓰인다고 한다.

 

즉, CountDownLatch는 다른 스레드가 특정 지점을 따라 잡을 때 까지 기다리게 하는 기준선 같은 역할을 해주기도 한다.

 

https://developer.android.com/reference/java/util/concurrent/CountDownLatch.html

 

 

CountDownLatch  |  Android Developers

CountDownLatch public class CountDownLatch extends Object java.lang.Object    ↳ java.util.concurrent.CountDownLatch A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. A CountD

developer.android.com

 

CountDownLatch

package CountDownLatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

public class CountDownLatchTest {
	public static void main(String[] args) {
		AtomicInteger ordinal = new AtomicInteger(0);
		final CountDownLatch latch = new CountDownLatch(10);
		
		for (int i = 0; i < 10; ++ i) {
		  Thread thread = new Thread() {
		  	@Override
		    public void run() {
					for(int i =  0; i < 1000000000; i++) {}
					
					ordinal.getAndIncrement();
					System.out.println("Waiting " + ordinal.get() + " thread");
					latch.countDown();
					
					try {
					    latch.await();
					} catch (InterruptedException e) {
					    e.printStackTrace();
					}
		  	}
		  };
		  thread.start();
		}
	}
}
반응형

'Basic > Java' 카테고리의 다른 글

Eclipse 자주 사용하는 단축키 모음  (0) 2019.11.07
ReentrantLock이란?  (0) 2019.08.01
Java에서 Collection이란?  (0) 2019.07.13
Java HashMap, Hashtable, ConcurrentHashMap  (0) 2019.07.10
콜백(Callback) 그리고 리스너(Listener)  (0) 2019.06.30