Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 익명클래스
- Semaphore
- ansible
- MSA
- devops
- Stress test
- 자바
- cloud native
- nGrinder
- Microservice
- CRD
- ingress
- Adapter 패턴
- 머신러닝
- 헬름
- cloud native java
- 클라우드 네이티브
- kubernetes
- decorator 패턴
- java
- spring microservice
- 마이크로서비스
- 클라우드 네이티브 자바
- Kotlin
- 코틀린
- Algorithm
- MySQL
- Spring
- 쿠버네티스
- 동기화
Archives
- Today
- Total
카샤의 만개시기
동기화 클래스 4편 - Exchanger 본문
두 쓰레드 간에 인스턴스를 교환해주는 역할로 사용합니다.
예제를 통해서 알아보도록 하겠습니다.메모리를 할당하는 A 쓰레드
와 메모리를 해제하는 B 쓰레드
가 있다고 할 때 A는 자신의 스택에 계속 데이터를 추가하고 쌓여있는 메모리를 해제하기 위해 A는 B와 스택을 교환하게 되고, 그러면 B는 교환 된 스택을 전부 비웁니다.
public final static int MAX_STACK_CNT = 8;
private Exchanger<LinkedList<Integer>> exchanger = new Exchanger<LinkedList<Integer>>();
class PushThread implements Runnable {
LinkedList<Integer> stack = new LinkedList<Integer>();
private Scanner sc = new Scanner(System.in);
public void run() {
while(!Thread.interrupted()) {
try {
// 스택의 크기를 넘기지 않는 범위에서 입력받은 값들을 스택에 넣는다.
while(stack.size() < MAX_STACK_CNT) {
int value = sc.nextInt();
stack.addLast(value);
}
// 스택이 가득차면 exchanger 스택과 교환한다
System.out.println("stack full");
stack = exchanger.exchange(stack);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class PopThread implements Runnable {
LinkedList<Integer> stack = new LinkedList<Integer>();
public void run() {
while(!Thread.interrupted()) {
try {
// 스택에 값이 존재하면 비운다.
while(!stack.isEmpty()) {
int value = stack.removeLast();
System.out.println(value);
}
// 스택이 비어지면 exchanger 스택과 교환한다
System.out.println("stack empty");
stack = exchanger.exchange(stack);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void runThread() {
new Thread(new PushThread()).start();
new Thread(new PopThread()).start();
}
실행 결과
stack empty
1
2
3
4
5
6
7
8
stack full
8
7
6
5
4
3
2
1
stack empty
NEXT
'Java > POJO' 카테고리의 다른 글
동기화 클래스 5편 - Executors, FutureTask, Future (0) | 2019.07.03 |
---|---|
동기화 클래스 3편 - CyclicBarrier (0) | 2019.07.03 |
동기화 클래스 2편 - CountDownLatch (0) | 2019.07.03 |
동기화 클래스 1편 - 세마포어(Semaphore) (0) | 2019.07.03 |
Java의 동기화 (atomic, volatile, synchronized) (0) | 2019.07.03 |
Comments