Skip to content

Commit a59effb

Browse files
committed
Today I Learned Thread
1 parent ba45c82 commit a59effb

5 files changed

Lines changed: 155 additions & 0 deletions

File tree

‎thread/bounded/BoundedMain.java‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package thread.bounded;
2+
3+
import util.MyLogger;
4+
import util.ThreadUtils;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class BoundedMain {
10+
public static void main(String[] args) {
11+
12+
// 1. BoundedQueue 선택
13+
BoundedQueue queue = new BoundedQueueV1(2);
14+
15+
// 2. 생산자, 소비자 실행 순서 선택, 반드 하나만 선탹!
16+
// producerFirst(queue);
17+
consumerFirst(queue);
18+
}
19+
20+
private static void producerFirst(BoundedQueue queue){
21+
MyLogger.log("== [생산자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " == ");
22+
List<Thread> threads = new ArrayList<>();
23+
startProducer(queue, threads);
24+
printAllState(queue, threads);
25+
startConsumer(queue, threads);
26+
printAllState(queue, threads);
27+
MyLogger.log("== [생산자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " == ");
28+
}
29+
30+
private static void consumerFirst(BoundedQueue queue){
31+
MyLogger.log("== [소비자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " == ");
32+
List<Thread> threads = new ArrayList<>();
33+
startConsumer(queue, threads);
34+
printAllState(queue, threads);
35+
startProducer(queue, threads);
36+
printAllState(queue, threads);
37+
MyLogger.log("== [소비자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " == ");
38+
}
39+
40+
private static void startConsumer(BoundedQueue queue, List<Thread> threads) {
41+
System.out.println();
42+
MyLogger.log("소비자 시작");
43+
for (int i = 1; i <= 3; i++) {
44+
Thread consumer = new Thread(new ConsumerTask(queue), "consumer" + i);
45+
threads.add(consumer);
46+
consumer.start();
47+
ThreadUtils.sleep(100);
48+
}
49+
}
50+
51+
private static void startProducer(BoundedQueue queue, List<Thread> threads){
52+
System.out.println();
53+
MyLogger.log("생성자 시작");
54+
for (int i = 1; i <= 3; i++) {
55+
Thread producer = new Thread(new ProducerTask(queue, "data" + i), "proudcer" + i);
56+
threads.add(producer);
57+
producer.start();
58+
ThreadUtils.sleep(100);
59+
}
60+
}
61+
private static void printAllState(BoundedQueue queue, List<Thread> threads) {
62+
System.out.println();
63+
MyLogger.log("현제 상태 출력, 큐 데이터 : " + queue);
64+
for(Thread thread : threads) {
65+
MyLogger.log(thread.getName() + ": " + thread.getState());
66+
}
67+
68+
}
69+
}

‎thread/bounded/BoundedQueue.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package thread.bounded;
2+
3+
public interface BoundedQueue {
4+
5+
void put(String data);
6+
7+
String take();
8+
}

‎thread/bounded/BoundedQueueV1.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package thread.bounded;
2+
3+
import util.MyLogger;
4+
5+
import java.util.ArrayDeque;
6+
import java.util.Queue;
7+
8+
public class BoundedQueueV1 implements BoundedQueue{
9+
private final Queue<String> queue = new ArrayDeque<>();
10+
private final int max;
11+
12+
public BoundedQueueV1(int max) {
13+
this.max = max;
14+
}
15+
16+
@Override
17+
public synchronized void put(String data) {
18+
if(queue.size() == max){
19+
MyLogger.log("[put] 큐가 가득 참, 버림 : " + data);
20+
return;
21+
}
22+
queue.offer(data);
23+
}
24+
25+
@Override
26+
public synchronized String take() {
27+
if(queue.isEmpty()) return null;
28+
return queue.poll();
29+
}
30+
31+
@Override
32+
public String toString() {
33+
// toString도 sychronized 를 원래는 붙혀줘야 된다.
34+
return queue.toString();
35+
}
36+
}

‎thread/bounded/ConsumerTask.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package thread.bounded;
2+
3+
import util.MyLogger;
4+
5+
public class ConsumerTask implements Runnable {
6+
7+
private BoundedQueue queue;
8+
9+
public ConsumerTask(BoundedQueue queue) {
10+
this.queue = queue;
11+
}
12+
13+
@Override
14+
public void run() {
15+
MyLogger.log("[소비 시도] ? <- " + queue);
16+
String data = queue.take();
17+
MyLogger.log("[소비 완료] " + data + " <- " + queue);
18+
}
19+
}

‎thread/bounded/ProducerTask.java‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package thread.bounded;
2+
3+
import util.MyLogger;
4+
5+
public class ProducerTask implements Runnable{
6+
7+
private BoundedQueue queue;
8+
private String request;
9+
10+
public ProducerTask(BoundedQueue queue, String request) {
11+
this.queue = queue;
12+
this.request = request;
13+
}
14+
15+
@Override
16+
public void run() {
17+
MyLogger.log("[생산 시도] " + request + " -> " + queue);
18+
queue.put(request);
19+
MyLogger.log("[생산 완료] " + request + " -> " + queue);
20+
21+
22+
}
23+
}

0 commit comments

Comments
 (0)