반응형
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
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 |