From 98a88c4397cca48bf1dfbab125c950986fc0bbdb Mon Sep 17 00:00:00 2001 From: minsu Date: Mon, 6 Nov 2023 10:19:03 +0900 Subject: [PATCH 1/4] Feat Thread exam and assignment --- .../parkminsu/assignment/Consumer.java | 59 ++++++++++++ .../parkminsu/assignment/Items.java | 15 +++ .../nhnacademy/parkminsu/assignment/Main.java | 27 ++++++ .../nhnacademy/parkminsu/assignment/Mart.java | 54 +++++++++++ .../parkminsu/assignment/Producer.java | 49 ++++++++++ .../parkminsu/assignment/Store.java | 94 +++++++++++++++++++ .../exception/NegativeNumException.java | 7 ++ .../nhnacademy/parkminsu/exam/Consumer.java | 49 ++++++++++ .../com/nhnacademy/parkminsu/exam/Main.java | 23 +++++ .../nhnacademy/parkminsu/exam/Proceducer.java | 42 +++++++++ .../com/nhnacademy/parkminsu/exam/Store.java | 89 ++++++++++++++++++ 11 files changed, 508 insertions(+) create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java create mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java new file mode 100644 index 0000000..60fe079 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java @@ -0,0 +1,59 @@ +package parkminsu.privatestudy.thread.assignment; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicBoolean; + +public class Consumer implements Runnable { + private Mart mart; + private Thread thread; + private AtomicBoolean isCheck; + + private int buyItem; + + public Consumer(Mart mart, String name) { + this.mart = mart; + thread = new Thread(this, name); + this.isCheck = new AtomicBoolean(false); + } + + public void start() { + thread.start(); + } + + public void stop() { + thread.interrupt(); + } + + public void join() throws InterruptedException { + thread.join(); + } + + public Thread getThread() { + return thread; + } + + + @Override + public void run() { + getBuyItem(); + mart.enterStore(buyItem); + while (!isCheck.get()) { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + mart.sellStoreItem(buyItem); + System.out.println(thread.getName() + "가 구매했습니다"); + isCheck.set(true); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println(e.getMessage()); + } + } + mart.exitStore(buyItem); + } + + public void getBuyItem() { + Random random = new Random(); + this.buyItem = random.nextInt(mart.getStore().length); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java new file mode 100644 index 0000000..bb2bb4d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java @@ -0,0 +1,15 @@ +package parkminsu.privatestudy.thread.assignment; + +public enum Items { + 과자(1500), + 이온음료(1600), + 커피(2000), + 냉동식품(8000), + 냉장식품(4000); + private int data; + + Items(int data) { + this.data = data; + } + +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java new file mode 100644 index 0000000..fd6fe5c --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java @@ -0,0 +1,27 @@ +package parkminsu.privatestudy.thread.assignment; + +import java.util.concurrent.ThreadLocalRandom; +import parkminsu.privatestudy.thread.assignment.exception.NegativeNumException; + + +public class Main { + public static void main(String[] args) { + try { + Mart mart = new Mart(5); + String name = "손님"; + int loop = 1; + + Producer producer = new Producer(mart); + producer.start(); + + while (true) { + Consumer consumer = new Consumer(mart, name + loop); + consumer.start(); + loop += 1; + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + } + } catch (NegativeNumException | InterruptedException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java new file mode 100644 index 0000000..cf4feb6 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java @@ -0,0 +1,54 @@ +package parkminsu.privatestudy.thread.assignment; + +import parkminsu.privatestudy.thread.assignment.exception.NegativeNumException; + +public class Mart { + private Store[] store; + private int storeNum; + + public Mart(int storeNum) throws NegativeNumException { + isCheckNegativeNum(storeNum); + this.storeNum = storeNum; + initStore(); + } + + private void initStore() { + this.store = new Store[this.storeNum]; + String str = "store"; + for (int i = 0; i < store.length; i++) { + this.store[i] = new Store(str + i); + } + } + + private void isCheckNegativeNum(int num) throws NegativeNumException { + if (isNegativeNum(num)) { + throw new NegativeNumException("음수를 입력하셨습니다"); + } + } + + private boolean isNegativeNum(int num) { + return num < 0; + } + + public Store[] getStore() { + return store; + } + + public void enterStore(int buyItemStore) { + System.out.println(buyItemStore + "번 째 마트에 입장했습니다"); + store[buyItemStore].enter(); + } + + public void sellStoreItem(int buyItemStore) { + store[buyItemStore].sell(); + } + + public void exitStore(int storeNum) { + store[storeNum].exit(); + } + + public void buyStore(int storeNum) { + System.out.println("공급자가 " + storeNum + "매장에 들어갔습니다"); + store[storeNum].buy(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java new file mode 100644 index 0000000..b835d5d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java @@ -0,0 +1,49 @@ +package parkminsu.privatestudy.thread.assignment; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * N개의 품목을 납품할 수 있음 + */ +public class Producer implements Runnable { + private Mart mart; + Thread thread; + private int productItem; + + public Producer(Mart mart) { + this.mart = mart; + thread = new Thread(this); + } + + public void start() { + thread.start(); + } + + public void stop() { + thread.interrupt(); + } + + public void join() throws InterruptedException { + thread.join(); + } + + @Override + public void run() { + while (!Thread.interrupted()) { + try { + produceGood(); + Thread.sleep(ThreadLocalRandom.current().nextInt(1_000, 10_000)); + mart.buyStore(productItem); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println(e.getMessage()); + } + } + } + + public void produceGood() { + Random random = new Random(); + this.productItem = random.nextInt(mart.getStore().length); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java new file mode 100644 index 0000000..b6f8f57 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java @@ -0,0 +1,94 @@ +package parkminsu.privatestudy.thread.assignment; + +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 마트에서는 N개의 품목 매장 + * 생산자가 품목을 납품하기 전까지 어떤 품목인지는 알 수 없음 + * 소비자는 품목별로 매장을 이용할 수 있음 + */ +public class Store { + + private AtomicInteger items; + private AtomicInteger currentPeople; + private final String name; + private final int storeMaxPeople = 5; + + private final Semaphore semaphore; + + public Store(String name) { + this.name = name; + this.items = new AtomicInteger(0); + this.currentPeople = new AtomicInteger(0); + this.semaphore = new Semaphore(storeMaxPeople); + } + + /** + * 매장에 사람이 들어오면 count + 1해줌 + */ + public void enter() { + try { + this.semaphore.acquire();// +1 5명 자동 lock + System.out.println("\n" + this.name + " 매장에 손님이 들어왔습니다"); + this.currentPeople.addAndGet(1); // 손님이 들어오면 +1 + System.out.println(this.name + " 매장 손님의 수: " + currentPeople + "\n"); + + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + + } + + public void exit() { + semaphore.release();// -1 + currentPeople.addAndGet(-1); + System.out.println(); + System.out.println(this.name + "매장에 손님이 나갔습니다"); + System.out.println(); + + } + + public synchronized void buy() { // 공급자한테 마트가 삼 + while (items.get() > 10) { + try { + System.out.println(); + System.out.println(this.name + "매장에 물품이 많습니다"); + System.out.println(); + wait(); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + Thread.currentThread().interrupt(); + } + } + if (items.get() <= 0) { + notifyAll(); + } + items.addAndGet(1); + System.out.println(); + System.out.println(this.name + "매장에 물품을 추가했습니다"); + System.out.println(this.name + "매장 현재 물품 수: " + items.get()); + System.out.println(); + + + } + + public synchronized void sell() { // 소비자 파는거 + while (items.get() <= 0) {// 물품이 없을 때 + try { + System.out.println(); + System.out.println(this.name + "매장에 물품이 없습니다"); + System.out.println(); + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + notifyAll(); + items.addAndGet(-1); // -1 + System.out.println(this.name + "매장에 현재 남은 물품: " + items.get()); + System.out.println(); + } + + +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java new file mode 100644 index 0000000..a7a0ebb --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java @@ -0,0 +1,7 @@ +package parkminsu.privatestudy.thread.assignment.exception; + +public class NegativeNumException extends Exception { + public NegativeNumException(String message) { + super(message); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java new file mode 100644 index 0000000..da2216c --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java @@ -0,0 +1,49 @@ +package parkminsu.privatestudy.thread.exam; + +import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 소비자는 매장에 입장 후 물건을 구매 + * 매장에는 입장 인원 제한이 있으므로 인원 초과시 기다림 + * 매장에 입장하면 물거은 구매하고 퇴장 + * 1~10초 간격으로 구매 + */ +public class Consumer implements Runnable { + private Store store; + private Thread thread; + private AtomicBoolean isCheck; + + + public Consumer(String name, Store store) { + thread = new Thread(this, name); + this.store = store; + this.isCheck = new AtomicBoolean(false); + } + + public void start() { + thread.start(); + } + + public void stop() { + thread.interrupt(); + } + + + @Override + public void run() { + store.enter(); + while (!isCheck.get()) { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + store.sell(); + System.out.println(thread.getName() + "가 구매했습니다"); + isCheck.set(true); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println(e.getMessage()); + } + } + store.exit(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java new file mode 100644 index 0000000..8fc6092 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java @@ -0,0 +1,23 @@ +package parkminsu.privatestudy.thread.exam; + +public class Main { + public static void main(String[] args) throws InterruptedException { + Store store = new Store(); + String name = "손님"; + int loop = 1; + Proceducer proceducer = new Proceducer(store); + proceducer.start(); + + while (true) { + Consumer consumer = new Consumer(name + loop, store); + + + consumer.start(); + loop += 1; + Thread.sleep(1500); + //Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + + + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java new file mode 100644 index 0000000..2683f54 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java @@ -0,0 +1,42 @@ +package parkminsu.privatestudy.thread.exam; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * 생산자는 매장에 물건이 부족하지 않도록 채워둠 + * 물건은 1~10초 간격으로 채움 + * Thread내에서 난수 생성을 위해서는 ThreadLocalRandom.current().nextInt() + * 사용 + */ +public class Proceducer implements Runnable { + private final Store store; + private Thread thread; + + public Proceducer(Store store) { + this.store = store; + thread = new Thread(this); + } + + public void start() { + thread.start(); + } + + public void stop() { + thread.interrupt(); + } + + @Override + public void run() { + try { + while (!Thread.interrupted()) { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + store.buy(); + } + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + Thread.currentThread().interrupt(); + + } + + } +} diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java new file mode 100644 index 0000000..cf6fd8d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java @@ -0,0 +1,89 @@ +package parkminsu.privatestudy.thread.exam; + +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 물건을 납품 받아서 판매 + * 10개의 물건만 전시 + * 매장은 최대 5명까지만 동시 입장 + * 물건 구매는 동시에 1명만 가능 + * 물건 판매 후 빈 공간에 생기면 생산자에게 알려줌 + * 물건 납품은 동시에 1명만 가능 + * 매장에서 물건이 들어오면 소비자에게 알려줌 + */ +public class Store { + AtomicInteger consumerCount; + AtomicInteger thingsCount; + Semaphore semaphore; + + public Store() { + semaphore = new Semaphore(5); + consumerCount = new AtomicInteger(0); + thingsCount = new AtomicInteger(0); + } + + /** + * 손님이 들어오면 count가 1 증가 + */ + public void enter() { + try { + semaphore.acquire(); + consumerCount.addAndGet(1); // +1 + System.out.println(); + System.out.println("입장했습니다"); + System.out.println("사람 수: " + consumerCount.get()); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + } + + /** + * 손님이 나가면 count를 1 감소 + */ + public void exit() { + consumerCount.addAndGet(-1); + System.out.println("손님이 나갔습니다"); + System.out.println(); + semaphore.release(); + } + + + public synchronized void buy() { // 공급자한테 마트가 삼 + while (thingsCount.get() > 10) { + try { + System.out.println("물품이 많습니다"); + wait(); + } catch (InterruptedException e) { + System.out.println(e.getMessage()); + Thread.currentThread().interrupt(); + } + } + thingsCount.addAndGet(1); + System.out.println(); + System.out.println("물품을 추가했습니다"); + System.out.println("현재 물품 수: " + thingsCount.get()); + System.out.println(); + + notifyAll(); + } + + public synchronized void sell() { // 소비자 파는거 + while (thingsCount.get() <= 0) {// 물품이 없을 때 + try { + System.out.println("물품이 없습니다"); + System.out.println(); + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + notifyAll(); + thingsCount.addAndGet(-1); // -1 + System.out.println("상품을 판매했습니다"); + System.out.println("현재 남은 물품: " + thingsCount.get()); + System.out.println(); + + + } +} From ff75dd3ea4f068e6f439c7c786f2bc41d3f63d00 Mon Sep 17 00:00:00 2001 From: minsu Date: Mon, 6 Nov 2023 11:22:54 +0900 Subject: [PATCH 2/4] Refactor Thread package --- .../java/com/nhnacademy/parkminsu/assignment/Consumer.java | 2 +- .../java/com/nhnacademy/parkminsu/assignment/Items.java | 2 +- .../main/java/com/nhnacademy/parkminsu/assignment/Main.java | 6 ++++-- .../main/java/com/nhnacademy/parkminsu/assignment/Mart.java | 5 +++-- .../java/com/nhnacademy/parkminsu/assignment/Producer.java | 2 +- .../java/com/nhnacademy/parkminsu/assignment/Store.java | 2 +- .../assignment/exception/NegativeNumException.java | 2 +- .../main/java/com/nhnacademy/parkminsu/exam/Consumer.java | 2 +- .../src/main/java/com/nhnacademy/parkminsu/exam/Main.java | 2 +- .../main/java/com/nhnacademy/parkminsu/exam/Proceducer.java | 2 +- .../src/main/java/com/nhnacademy/parkminsu/exam/Store.java | 2 +- 11 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java index 60fe079..1734fb6 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java index bb2bb4d..28681b0 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; public enum Items { 과자(1500), diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java index fd6fe5c..4267dd8 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Main.java @@ -1,7 +1,9 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; + + +import com.nhnacademy.parkminsu.assignment.exception.NegativeNumException; import java.util.concurrent.ThreadLocalRandom; -import parkminsu.privatestudy.thread.assignment.exception.NegativeNumException; public class Main { diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java index cf4feb6..d85aa61 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Mart.java @@ -1,6 +1,7 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; -import parkminsu.privatestudy.thread.assignment.exception.NegativeNumException; + +import com.nhnacademy.parkminsu.assignment.exception.NegativeNumException; public class Mart { private Store[] store; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java index b835d5d..4c44be5 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Producer.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java index b6f8f57..0e3d93c 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Store.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.assignment; +package com.nhnacademy.parkminsu.assignment; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java index a7a0ebb..4229c53 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/exception/NegativeNumException.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.assignment.exception; +package com.nhnacademy.parkminsu.assignment.exception; public class NegativeNumException extends Exception { public NegativeNumException(String message) { diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java index da2216c..0763189 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.exam; +package com.nhnacademy.parkminsu.exam; import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java index 8fc6092..2b9e083 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Main.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.exam; +package com.nhnacademy.parkminsu.exam; public class Main { public static void main(String[] args) throws InterruptedException { diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java index 2683f54..eb99263 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Proceducer.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.exam; +package com.nhnacademy.parkminsu.exam; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java index cf6fd8d..aa31e01 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java @@ -1,4 +1,4 @@ -package parkminsu.privatestudy.thread.exam; +package com.nhnacademy.parkminsu.exam; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; From 32d59ac684299c85f5431c93771bafc3587af461 Mon Sep 17 00:00:00 2001 From: minsu Date: Wed, 8 Nov 2023 09:25:11 +0900 Subject: [PATCH 3/4] Refactor: Thread assignment and exam package --- .../parkminsu/assignment/Consumer.java | 29 +++++++++---------- .../nhnacademy/parkminsu/exam/Consumer.java | 21 +++++++------- .../com/nhnacademy/parkminsu/exam/Store.java | 7 +++-- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java index 1734fb6..42a0954 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Consumer.java @@ -13,7 +13,7 @@ public class Consumer implements Runnable { public Consumer(Mart mart, String name) { this.mart = mart; - thread = new Thread(this, name); + this.thread = new Thread(this, name); this.isCheck = new AtomicBoolean(false); } @@ -37,23 +37,22 @@ public Thread getThread() { @Override public void run() { getBuyItem(); - mart.enterStore(buyItem); - while (!isCheck.get()) { - try { - Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); - mart.sellStoreItem(buyItem); - System.out.println(thread.getName() + "가 구매했습니다"); - isCheck.set(true); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println(e.getMessage()); - } + this.mart.enterStore(buyItem); + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + this.mart.sellStoreItem(buyItem); + System.out.println(thread.getName() + "가 구매했습니다"); + isCheck.set(true); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println(e.getMessage()); + } - mart.exitStore(buyItem); + this.mart.exitStore(buyItem); } - public void getBuyItem() { + private void getBuyItem() { Random random = new Random(); - this.buyItem = random.nextInt(mart.getStore().length); + this.buyItem = random.nextInt(this.mart.getStore().length); } } diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java index 0763189..91e0981 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Consumer.java @@ -16,7 +16,7 @@ public class Consumer implements Runnable { public Consumer(String name, Store store) { - thread = new Thread(this, name); + this.thread = new Thread(this, name); this.store = store; this.isCheck = new AtomicBoolean(false); } @@ -33,17 +33,16 @@ public void stop() { @Override public void run() { store.enter(); - while (!isCheck.get()) { - try { - Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); - store.sell(); - System.out.println(thread.getName() + "가 구매했습니다"); - isCheck.set(true); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - System.out.println(e.getMessage()); - } + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + store.sell(); + System.out.println(thread.getName() + "가 구매했습니다"); + isCheck.set(true); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println(e.getMessage()); } + store.exit(); } } diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java index aa31e01..850ea5d 100644 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java +++ b/Thread/src/main/java/com/nhnacademy/parkminsu/exam/Store.java @@ -13,10 +13,11 @@ * 매장에서 물건이 들어오면 소비자에게 알려줌 */ public class Store { - AtomicInteger consumerCount; - AtomicInteger thingsCount; - Semaphore semaphore; + private final AtomicInteger consumerCount; + private final AtomicInteger thingsCount; + private final Semaphore semaphore; + @SuppressWarnings("checkstyle:MissingJavadocMethod") public Store() { semaphore = new Semaphore(5); consumerCount = new AtomicInteger(0); From ee047cc7eeaac146615077dc61691ccae6d7a724 Mon Sep 17 00:00:00 2001 From: minsu Date: Wed, 8 Nov 2023 09:26:43 +0900 Subject: [PATCH 4/4] Refactor: Thread --- .../nhnacademy/parkminsu/assignment/Items.java | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java diff --git a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java b/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java deleted file mode 100644 index 28681b0..0000000 --- a/Thread/src/main/java/com/nhnacademy/parkminsu/assignment/Items.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.nhnacademy.parkminsu.assignment; - -public enum Items { - 과자(1500), - 이온음료(1600), - 커피(2000), - 냉동식품(8000), - 냉장식품(4000); - private int data; - - Items(int data) { - this.data = data; - } - -}