From 61746919e8627f6a0d25ab131c239b228c11acd5 Mon Sep 17 00:00:00 2001 From: 20203174 Date: Mon, 6 Nov 2023 10:52:54 +0900 Subject: [PATCH 1/3] thread upload --- .idea/compiler.xml | 1 + .../gaeun/assignment01/Consumer.java | 59 ++++++++++++++ .../gaeun/assignment01/FoodStand.java | 36 +++++++++ .../nhnacademy/gaeun/assignment01/Main.java | 21 +++++ .../gaeun/assignment01/Producer.java | 62 +++++++++++++++ .../gaeun/assignment01/Product.java | 60 ++++++++++++++ .../nhnacademy/gaeun/assignment01/Store.java | 51 ++++++++++++ .../assignment01/product/CannedFoods.java | 9 +++ .../assignment01/product/DriedSeafood.java | 9 +++ .../assignment01/product/OtherItems.java | 9 +++ .../assignment01/product/ProcessedFood.java | 9 +++ .../gaeun/assignment01/product/Vegetable.java | 9 +++ .../gaeun/assignment02/Consumer.java | 59 ++++++++++++++ .../gaeun/assignment02/FoodStand.java | 33 ++++++++ .../nhnacademy/gaeun/assignment02/Main.java | 21 +++++ .../gaeun/assignment02/Producer.java | 66 ++++++++++++++++ .../gaeun/assignment02/Product.java | 60 ++++++++++++++ .../nhnacademy/gaeun/assignment02/Store.java | 45 +++++++++++ .../assignment02/product/CannedFoods.java | 9 +++ .../assignment02/product/DriedSeafood.java | 9 +++ .../assignment02/product/OtherItems.java | 9 +++ .../assignment02/product/ProcessedFood.java | 9 +++ .../gaeun/assignment02/product/Vegetable.java | 9 +++ .../nhnacademy/gaeun/example/Consumer.java | 35 +++++++++ .../com/nhnacademy/gaeun/example/Main.java | 27 +++++++ .../nhnacademy/gaeun/example/Producer.java | 24 ++++++ .../com/nhnacademy/gaeun/example/Product.java | 4 + .../com/nhnacademy/gaeun/example/Store.java | 78 +++++++++++++++++++ 28 files changed, 832 insertions(+) create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index c46bc0c..112e59b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -29,6 +29,7 @@ + diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java new file mode 100644 index 0000000..4d65b1d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java @@ -0,0 +1,59 @@ +package org.example.thread.assignment01; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class Consumer implements Runnable { + private Store store; + private String name; + private Random random; + public static int count = 0; + + public Consumer(String name, Store store) { + this.store = store; + this.name = name + ++count; + } + + public String getName() { + return name; + } + + @Override + public void run() { + try { + store.enter(this); + sellRandomTime(); + store.exit(this); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + + private void sellRandomTime() { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + pickFoods(); + } + + public void pickFoods() { + int productNum = randomProductNum(); + int amount = randomAmount(); + Product product = store.getFoodStand().getFoodsList().get(productNum); + store.getFoodStand().sell(product, amount); + } + + private int randomAmount() { + random = new Random(); + return random.nextInt(10) + 1; + } + + private int randomProductNum() { + random = new Random(); + return random.nextInt(store.getFoodStand().getFoodsList().size()); + } + +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java new file mode 100644 index 0000000..6b0332e --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java @@ -0,0 +1,36 @@ +package org.example.thread.assignment01; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class FoodStand { + private List productList; + + public FoodStand() { + this.productList = new ArrayList<>(); + } + + + public List getFoodsList() { + return this.productList; + } + + public void add(Product product, int amount) { + if(productList.contains(product)) { + product.add(amount); + } else { + productList.add(product); + } + } + + public void sell(Product product, int amount) { //상품 판매 + if(productList.contains(product)) { + product.sell(amount); + } else { + throw new IllegalArgumentException("해당 상품이 존재하지 않습니다."); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java new file mode 100644 index 0000000..62d08b6 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java @@ -0,0 +1,21 @@ +package org.example.thread.assignment01; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class Main { + public static void main(String[] args) throws InterruptedException { + Store store = new Store(); + Producer producer = new Producer(store); + Thread producerThread = new Thread(producer); + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + Runnable consumerTask = () -> { + Consumer consumer = new Consumer("Consumer", store); + Thread consumerThread = new Thread(consumer); + consumerThread.start(); + }; + executorService.scheduleAtFixedRate(consumerTask, 0, 5, TimeUnit.SECONDS); + producerThread.start(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java new file mode 100644 index 0000000..b9bd8eb --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java @@ -0,0 +1,62 @@ +package org.example.thread.assignment01; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import org.example.thread.assignment01.product.*; + +public class Producer implements Runnable { + private Store store; + private List itemList; + private Random random; + + public Producer(Store store) { + this.store = store; + this.itemList = new ArrayList<>(); + initialSetting(); + } + + private void initialSetting() { + itemList.add(new Vegetable("야채", 30)); + itemList.add(new ProcessedFood("조리 식품", 30)); + itemList.add(new DriedSeafood("건어물", 30)); + itemList.add(new CannedFoods("기호 식품", 30)); + itemList.add(new OtherItems("기타", 30)); + } + + @Override + public void run() { + while (!Thread.interrupted()) { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + + randomDelivery(); + } + } + + private void randomDelivery() { + int deliveryNum = randomDeliveryNum(); + int amount = randomAmount(); + Product product = bringProduct(deliveryNum); + store.getFoodStand().add(product, amount); + + } + private int randomAmount() { + random = new Random(); + return random.nextInt(10) + 1; + } + + private int randomDeliveryNum() { + random = new Random(); + return random.nextInt(itemList.size()); + } + + private Product bringProduct(int deliveryNum) { + return itemList.get(deliveryNum); + } +} \ No newline at end of file diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java new file mode 100644 index 0000000..b2d8167 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java @@ -0,0 +1,60 @@ +package org.example.thread.assignment01; + +public class Product { + + private String name; + private int amount; + public static final int MAX_NUM = 30; + public Product(String name, int amount) { + this.name = name; + this.amount = amount; + } + public String getName() { + return name; + } + + public synchronized boolean isAbleBuy(int amount) { + if (amount > 30) { + System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); + return false; + } + if (this.amount + amount > MAX_NUM) { + System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); + return false; + } + return true; + } + + public synchronized boolean isAbleSell(int amount) { + return (this.amount - amount >= 0); + } + + public synchronized void add(int amount) { + while (!isAbleBuy(amount)) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + this.amount += amount; + System.out.printf("%s %d개가 가판대에 추가 되었습니다.\n", this.name, amount); + notifyAll(); + } + + public synchronized void sell(int amount) { //상품 판매 + while (!isAbleSell(amount)) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + if(isAbleSell(amount)) { + this.amount -= amount; + System.out.printf("%s %d개 구매 완료.\n", this.name, amount); + System.out.printf("남은 %s의 수량: %d\n", this.name, this.amount); + notifyAll(); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java new file mode 100644 index 0000000..979dd9b --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java @@ -0,0 +1,51 @@ +package org.example.thread.assignment01; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Store { + private List people; + + private FoodStand foodStand; + + public static final int PEOPLE_NUM_LIMIT = 5; + + public Store() { + people = new ArrayList<>(); + foodStand = new FoodStand(); + } + + public FoodStand getFoodStand() { + return foodStand; + } + + public synchronized boolean isAbleEnter() { + return people.size() < PEOPLE_NUM_LIMIT; + } + + public synchronized void enter(Consumer consumer) { + if (consumer == null) { + throw new IllegalArgumentException("consumer is null"); + } + while (!isAbleEnter()) { + try { + System.out.println("대기중입니다 ..."); + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + people.add(consumer); + System.out.println(consumer.getName() + " enter"); + } + + public synchronized void exit(Consumer consumer) { + if (people.contains(consumer)) { + people.remove(consumer); + System.out.println(consumer.getName() + " exit"); + notifyAll(); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java new file mode 100644 index 0000000..988c4bb --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment01.product; + +import org.example.thread.assignment01.Product; + +public class CannedFoods extends Product { + public CannedFoods(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java new file mode 100644 index 0000000..d120996 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment01.product; + +import org.example.thread.assignment01.Product; + +public class DriedSeafood extends Product { + public DriedSeafood(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java new file mode 100644 index 0000000..d46705c --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment01.product; + +import org.example.thread.assignment01.Product; + +public class OtherItems extends Product { + public OtherItems(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java new file mode 100644 index 0000000..00f5369 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment01.product; + +import org.example.thread.assignment01.Product; + +public class ProcessedFood extends Product { + public ProcessedFood(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java new file mode 100644 index 0000000..ad7db17 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment01.product; + +import org.example.thread.assignment01.Product; + +public class Vegetable extends Product { + public Vegetable(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java new file mode 100644 index 0000000..e6b0173 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java @@ -0,0 +1,59 @@ +package org.example.thread.assignment02; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class Consumer implements Runnable { + private Store store; + private String name; + private Random random; + public static int count = 0; + + public Consumer(String name, Store store) { + this.store = store; + this.name = name + ++count; + } + + public String getName() { + return name; + } + + @Override + public void run() { + try { + store.enter(this); + sellRandomTime(); + store.exit(this); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + + private void sellRandomTime() { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + pickFoods(); + } + + public void pickFoods() { + int productNum = randomProductNum(); + int amount = randomAmount(); + Product product = store.getFoodStand().getFoodsList().get(productNum); + store.getFoodStand().sell(product, amount); + } + + private int randomAmount() { + random = new Random(); + return random.nextInt(10) + 1; + } + + private int randomProductNum() { + random = new Random(); + return random.nextInt(store.getFoodStand().getFoodsList().size()); + } + +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java new file mode 100644 index 0000000..ec96e61 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java @@ -0,0 +1,33 @@ +package org.example.thread.assignment02; + +import java.util.ArrayList; +import java.util.List; + +public class FoodStand { + private List productList; + + public FoodStand() { + this.productList = new ArrayList<>(); + } + + + public List getFoodsList() { + return this.productList; + } + + public void add(Product product, int amount) { + if(productList.contains(product)) { + product.add(amount); + } else { + productList.add(product); + } + } + + public void sell(Product product, int amount) { //상품 판매 + if(productList.contains(product)) { + product.sell(amount); + } else { + throw new IllegalArgumentException("해당 상품이 존재하지 않습니다."); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java new file mode 100644 index 0000000..b7a27a6 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java @@ -0,0 +1,21 @@ +package org.example.thread.assignment02; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class Main { + public static void main(String[] args) throws InterruptedException { + Store store = new Store(); + Producer producer = new Producer(store); + Thread producerThread = new Thread(producer); + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + Runnable consumerTask = () -> { + Consumer consumer = new Consumer("Consumer", store); + Thread consumerThread = new Thread(consumer); + consumerThread.start(); + }; + executorService.scheduleAtFixedRate(consumerTask, 0, 5, TimeUnit.SECONDS); + producerThread.start(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java new file mode 100644 index 0000000..c0e4c43 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java @@ -0,0 +1,66 @@ +package org.example.thread.assignment02; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; +import org.example.thread.assignment02.product.CannedFoods; +import org.example.thread.assignment02.product.DriedSeafood; +import org.example.thread.assignment02.product.OtherItems; +import org.example.thread.assignment02.product.ProcessedFood; +import org.example.thread.assignment02.product.Vegetable; + +public class Producer implements Runnable { + private Store store; + private List itemList; + private Random random; + + public Producer(Store store) { + this.store = store; + this.itemList = new ArrayList<>(); + initialSetting(); + } + + private void initialSetting() { + itemList.add(new Vegetable("야채", 30)); + itemList.add(new ProcessedFood("조리 식품", 30)); + itemList.add(new DriedSeafood("건어물", 30)); + itemList.add(new CannedFoods("기호 식품", 30)); + itemList.add(new OtherItems("기타", 30)); + } + + @Override + public void run() { + while (!Thread.interrupted()) { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + + randomDelivery(); + } + } + + private void randomDelivery() { + int deliveryNum = randomDeliveryNum(); + int amount = randomAmount(); + Product product = bringProduct(deliveryNum); + store.getFoodStand().add(product, amount); + + } + private int randomAmount() { + random = new Random(); + return random.nextInt(10) + 1; + } + + private int randomDeliveryNum() { + random = new Random(); + return random.nextInt(itemList.size()); + } + + private Product bringProduct(int deliveryNum) { + return itemList.get(deliveryNum); + } +} \ No newline at end of file diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java new file mode 100644 index 0000000..82c29a0 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java @@ -0,0 +1,60 @@ +package org.example.thread.assignment02; + +public class Product { + + private String name; + private int amount; + public static final int MAX_NUM = 30; + public Product(String name, int amount) { + this.name = name; + this.amount = amount; + } + public String getName() { + return name; + } + + public synchronized boolean isAbleBuy(int amount) { + if (amount > 30) { + System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); + return false; + } + if (this.amount + amount > MAX_NUM) { + System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); + return false; + } + return true; + } + + public synchronized boolean isAbleSell(int amount) { + return (this.amount - amount >= 0); + } + + public synchronized void add(int amount) { + while (!isAbleBuy(amount)) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + this.amount += amount; + System.out.printf("%s %d개가 가판대에 추가 되었습니다.\n", this.name, amount); + notifyAll(); + } + + public synchronized void sell(int amount) { //상품 판매 + while (!isAbleSell(amount)) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + if(isAbleSell(amount)) { + this.amount -= amount; + System.out.printf("%s %d개 구매 완료.\n", this.name, amount); + System.out.printf("남은 %s의 수량: %d\n", this.name, this.amount); + notifyAll(); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java new file mode 100644 index 0000000..a63fb3a --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java @@ -0,0 +1,45 @@ +package org.example.thread.assignment02; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Semaphore; + +public class Store { + private List people; + + private FoodStand foodStand; + private Semaphore semaphore; + + public static final int PEOPLE_NUM_LIMIT = 5; + + public Store() { + this.people = new ArrayList<>(); + this.foodStand = new FoodStand(); + this.semaphore = new Semaphore(PEOPLE_NUM_LIMIT); + } + + public FoodStand getFoodStand() { + return foodStand; + } + + public void enter(Consumer consumer) { + if (consumer == null) { + throw new IllegalArgumentException("consumer is null"); + } + try { + semaphore.acquire(); + people.add(consumer); + System.out.println(consumer.getName() + " enter"); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + public void exit(Consumer consumer) { + if (people.contains(consumer)) { + people.remove(consumer); + System.out.println(consumer.getName() + " exit"); + semaphore.release(); + } + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java new file mode 100644 index 0000000..ed8d02f --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment02.product; + +import org.example.thread.assignment02.Product; + +public class CannedFoods extends Product { + public CannedFoods(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java new file mode 100644 index 0000000..e4e52ad --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment02.product; + +import org.example.thread.assignment02.Product; + +public class DriedSeafood extends Product { + public DriedSeafood(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java new file mode 100644 index 0000000..185cb4d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment02.product; + +import org.example.thread.assignment02.Product; + +public class OtherItems extends Product { + public OtherItems(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java new file mode 100644 index 0000000..dde4635 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment02.product; + +import org.example.thread.assignment02.Product; + +public class ProcessedFood extends Product { + public ProcessedFood(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java new file mode 100644 index 0000000..6fc3504 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java @@ -0,0 +1,9 @@ +package org.example.thread.assignment02.product; + +import org.example.thread.assignment02.Product; + +public class Vegetable extends Product { + public Vegetable(String name, int amount) { + super(name, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java new file mode 100644 index 0000000..df0d483 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java @@ -0,0 +1,35 @@ +package org.example.thread.example; + +import java.util.concurrent.ThreadLocalRandom; + +public class Consumer implements Runnable { + Store store; + String name; + public static int count = 0; + + public Consumer(String name, Store store) { + this.store = store; + this.name = name + count++; + } + + public String getName() { + return name; + } + + @Override + public void run() { + store.enter(this); + sellRandomTime(); + store.exit(this); + } + + private void sellRandomTime() { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + store.sell(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java new file mode 100644 index 0000000..19c565b --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java @@ -0,0 +1,27 @@ +package org.example.thread.example; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +public class Main { + public static void main(String[] args) throws InterruptedException { + Store store = new Store(); + Producer producer = new Producer(store); + Thread producerThread = new Thread(producer); + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); + + Runnable consumerTask = () -> { + Consumer consumer = new Consumer("Consumer", store); + Thread consumerThread = new Thread(consumer); + consumerThread.start(); + }; + + executorService.scheduleAtFixedRate(consumerTask, 0, 5, TimeUnit.SECONDS); + + producerThread.start(); + + producerThread.join(); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java new file mode 100644 index 0000000..9ac1f31 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java @@ -0,0 +1,24 @@ +package org.example.thread.example; + +import java.util.concurrent.ThreadLocalRandom; + +public class Producer implements Runnable { + Store store; + + public Producer(Store store) { + this.store = store; + } + + @Override + public void run() { + while (!Thread.interrupted()) { + try { + Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 5000)); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + System.out.println("Thread Interrupted"); + } + store.buy(); + } + } +} \ No newline at end of file diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java new file mode 100644 index 0000000..dad2c8d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java @@ -0,0 +1,4 @@ +package org.example.thread.example; + +public class Product { +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java new file mode 100644 index 0000000..691451f --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java @@ -0,0 +1,78 @@ +package org.example.thread.example; + +import java.util.ArrayList; +import java.util.List; + +public class Store { + List productList; + List people; + + public static final int MAX_NUM = 10; + + public static final int PEOPLE_NUM_LIMIT = 5; + + public synchronized boolean isAbleBuy() { + return productList.size() < MAX_NUM; + } + + public synchronized boolean isAbleSell() { + return !productList.isEmpty(); + } + + public synchronized boolean isAbleEnter() { + return people.size() < PEOPLE_NUM_LIMIT; + } + + + public Store() { + productList = new ArrayList<>(); + people = new ArrayList<>(); + } + + public synchronized void enter(Consumer consumer) { + if (consumer == null) { + throw new IllegalArgumentException("consumer is null"); + } + while (!isAbleEnter()) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + people.add(consumer); + System.out.println(consumer.getName() + " enter"); + notifyAll(); + } + + public synchronized void exit(Consumer consumer) { + if (people.contains(consumer)) { + people.remove(consumer); + System.out.println(consumer.getName() + " exit"); + notifyAll(); + } + } + + public synchronized void buy() { //상품 진열 + while (!isAbleBuy()) { + try { + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + Product product = new Product(); + productList.add(product); + System.out.println("product add"); + System.out.println(productList.size()); + } + + public synchronized void sell() { //상품 판매 + if (isAbleSell()) { + productList.remove(0); + System.out.println("product get"); + System.out.println(productList.size()); + notifyAll(); + } + } +} From e707cd86a9f09915cccffac27cd895527d28730b Mon Sep 17 00:00:00 2001 From: 20203174 Date: Mon, 6 Nov 2023 20:49:04 +0900 Subject: [PATCH 2/3] modify --- .../java/com/nhnacademy/gaeun/assignment01/Consumer.java | 2 +- .../com/nhnacademy/gaeun/assignment01/FoodStand.java | 3 +-- .../java/com/nhnacademy/gaeun/assignment01/Main.java | 3 +-- .../java/com/nhnacademy/gaeun/assignment01/Producer.java | 6 +++--- .../java/com/nhnacademy/gaeun/assignment01/Product.java | 3 +-- .../java/com/nhnacademy/gaeun/assignment01/Store.java | 3 +-- .../gaeun/assignment01/product/CannedFoods.java | 5 ++--- .../gaeun/assignment01/product/DriedSeafood.java | 6 ++---- .../gaeun/assignment01/product/OtherItems.java | 6 ++---- .../gaeun/assignment01/product/ProcessedFood.java | 5 ++--- .../nhnacademy/gaeun/assignment01/product/Vegetable.java | 5 ++--- .../java/com/nhnacademy/gaeun/assignment02/Consumer.java | 2 +- .../com/nhnacademy/gaeun/assignment02/FoodStand.java | 3 ++- .../java/com/nhnacademy/gaeun/assignment02/Main.java | 3 ++- .../java/com/nhnacademy/gaeun/assignment02/Producer.java | 9 +++------ .../java/com/nhnacademy/gaeun/assignment02/Product.java | 3 ++- .../java/com/nhnacademy/gaeun/assignment02/Store.java | 2 +- .../gaeun/assignment02/product/CannedFoods.java | 4 ++-- .../gaeun/assignment02/product/DriedSeafood.java | 5 ++--- .../gaeun/assignment02/product/OtherItems.java | 4 ++-- .../gaeun/assignment02/product/ProcessedFood.java | 4 ++-- .../nhnacademy/gaeun/assignment02/product/Vegetable.java | 5 +++-- .../main/java/com/nhnacademy/gaeun/example/Consumer.java | 2 +- .../src/main/java/com/nhnacademy/gaeun/example/Main.java | 2 +- .../main/java/com/nhnacademy/gaeun/example/Producer.java | 2 +- .../main/java/com/nhnacademy/gaeun/example/Product.java | 2 +- .../main/java/com/nhnacademy/gaeun/example/Store.java | 2 +- 27 files changed, 45 insertions(+), 56 deletions(-) diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java index 4d65b1d..874e1b5 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java @@ -1,4 +1,4 @@ -package org.example.thread.assignment01; +package com.nhnacademy.gaeun.assignment01; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java index 6b0332e..a4ba428 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java @@ -1,5 +1,4 @@ -package org.example.thread.assignment01; - +package com.nhnacademy.gaeun.assignment01; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java index 62d08b6..338024f 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java @@ -1,5 +1,4 @@ -package org.example.thread.assignment01; - +package com.nhnacademy.gaeun.assignment01; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java index b9bd8eb..aec8106 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java @@ -1,10 +1,10 @@ -package org.example.thread.assignment01; - +package com.nhnacademy.gaeun.assignment01; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import org.example.thread.assignment01.product.*; + +import com.nhnacademy.gaeun.assignment01.product.*; public class Producer implements Runnable { private Store store; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java index b2d8167..7251292 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java @@ -1,5 +1,4 @@ -package org.example.thread.assignment01; - +package com.nhnacademy.gaeun.assignment01; public class Product { private String name; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java index 979dd9b..a3d77d7 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java @@ -1,5 +1,4 @@ -package org.example.thread.assignment01; - +package com.nhnacademy.gaeun.assignment01; import java.util.ArrayList; import java.util.HashMap; import java.util.List; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java index 988c4bb..d0e913c 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java @@ -1,6 +1,5 @@ -package org.example.thread.assignment01.product; - -import org.example.thread.assignment01.Product; +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Product; public class CannedFoods extends Product { public CannedFoods(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java index d120996..4db1720 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java @@ -1,7 +1,5 @@ -package org.example.thread.assignment01.product; - -import org.example.thread.assignment01.Product; - +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Product; public class DriedSeafood extends Product { public DriedSeafood(String name, int amount) { super(name, amount); diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java index d46705c..da93b46 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java @@ -1,7 +1,5 @@ -package org.example.thread.assignment01.product; - -import org.example.thread.assignment01.Product; - +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Product; public class OtherItems extends Product { public OtherItems(String name, int amount) { super(name, amount); diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java index 00f5369..fb87dc7 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java @@ -1,6 +1,5 @@ -package org.example.thread.assignment01.product; - -import org.example.thread.assignment01.Product; +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Product; public class ProcessedFood extends Product { public ProcessedFood(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java index ad7db17..a03b5ff 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java @@ -1,6 +1,5 @@ -package org.example.thread.assignment01.product; - -import org.example.thread.assignment01.Product; +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Product; public class Vegetable extends Product { public Vegetable(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java index e6b0173..9171e10 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java @@ -1,4 +1,4 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java index ec96e61..2bc6757 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java @@ -1,4 +1,5 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; + import java.util.ArrayList; import java.util.List; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java index b7a27a6..9c55418 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java @@ -1,4 +1,5 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; + import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java index c0e4c43..1c4244a 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java @@ -1,14 +1,11 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; -import org.example.thread.assignment02.product.CannedFoods; -import org.example.thread.assignment02.product.DriedSeafood; -import org.example.thread.assignment02.product.OtherItems; -import org.example.thread.assignment02.product.ProcessedFood; -import org.example.thread.assignment02.product.Vegetable; + +import com.nhnacademy.gaeun.assignment02.product.*; public class Producer implements Runnable { private Store store; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java index 82c29a0..f73993c 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java @@ -1,4 +1,5 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; + public class Product { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java index a63fb3a..c06081b 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java @@ -1,4 +1,4 @@ -package org.example.thread.assignment02; +package com.nhnacademy.gaeun.assignment02; import java.util.ArrayList; import java.util.List; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java index ed8d02f..da8335d 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java @@ -1,6 +1,6 @@ -package org.example.thread.assignment02.product; +package com.nhnacademy.gaeun.assignment02.product; -import org.example.thread.assignment02.Product; +import com.nhnacademy.gaeun.assignment02.Product; public class CannedFoods extends Product { public CannedFoods(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java index e4e52ad..d9e18a2 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java @@ -1,7 +1,6 @@ -package org.example.thread.assignment02.product; - -import org.example.thread.assignment02.Product; +package com.nhnacademy.gaeun.assignment02.product; +import com.nhnacademy.gaeun.assignment02.Product; public class DriedSeafood extends Product { public DriedSeafood(String name, int amount) { super(name, amount); diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java index 185cb4d..ca6ef72 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java @@ -1,6 +1,6 @@ -package org.example.thread.assignment02.product; +package com.nhnacademy.gaeun.assignment02.product; -import org.example.thread.assignment02.Product; +import com.nhnacademy.gaeun.assignment02.Product; public class OtherItems extends Product { public OtherItems(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java index dde4635..aa4848b 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java @@ -1,6 +1,6 @@ -package org.example.thread.assignment02.product; +package com.nhnacademy.gaeun.assignment02.product; -import org.example.thread.assignment02.Product; +import com.nhnacademy.gaeun.assignment02.Product; public class ProcessedFood extends Product { public ProcessedFood(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java index 6fc3504..b1a3ca0 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java @@ -1,6 +1,7 @@ -package org.example.thread.assignment02.product; +package com.nhnacademy.gaeun.assignment02.product; -import org.example.thread.assignment02.Product; + +import com.nhnacademy.gaeun.assignment02.Product; public class Vegetable extends Product { public Vegetable(String name, int amount) { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java index df0d483..e079e1f 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java @@ -1,4 +1,4 @@ -package org.example.thread.example; +package com.nhnacademy.gaeun.example; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java index 19c565b..25f5f05 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java @@ -1,4 +1,4 @@ -package org.example.thread.example; +package com.nhnacademy.gaeun.example; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java index 9ac1f31..201cc4b 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java @@ -1,4 +1,4 @@ -package org.example.thread.example; +package com.nhnacademy.gaeun.example; import java.util.concurrent.ThreadLocalRandom; diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java index dad2c8d..1156a7e 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java @@ -1,4 +1,4 @@ -package org.example.thread.example; +package com.nhnacademy.gaeun.example; public class Product { } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java index 691451f..23e3889 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java @@ -1,4 +1,4 @@ -package org.example.thread.example; +package com.nhnacademy.gaeun.example; import java.util.ArrayList; import java.util.List; From aa180b03106f54f397f5b53baf2c3c90981e6d09 Mon Sep 17 00:00:00 2001 From: 20203174 Date: Fri, 10 Nov 2023 00:09:06 +0900 Subject: [PATCH 3/3] modify --- .../gaeun/assignment01/Consumer.java | 15 +++-- .../gaeun/assignment01/FoodStand.java | 11 ++-- .../nhnacademy/gaeun/assignment01/Main.java | 4 +- .../nhnacademy/gaeun/assignment01/Mart.java | 50 +++++++++++++++ .../gaeun/assignment01/Producer.java | 21 +++---- .../gaeun/assignment01/Product.java | 59 ------------------ .../nhnacademy/gaeun/assignment01/Store.java | 61 ++++++++++--------- .../gaeun/assignment01/StoreFactory.java | 6 ++ .../factory/CannedFoodsFactory.java | 12 ++++ .../assignment01/product/CannedFoods.java | 8 ++- .../assignment01/product/DriedSeafood.java | 4 +- .../assignment01/product/OtherItems.java | 4 +- .../assignment01/product/ProcessedFood.java | 4 +- .../gaeun/assignment01/product/Vegetable.java | 4 +- 14 files changed, 141 insertions(+), 122 deletions(-) create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Mart.java delete mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/StoreFactory.java create mode 100644 Thread/src/main/java/com/nhnacademy/gaeun/assignment01/factory/CannedFoodsFactory.java diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java index 874e1b5..fd2dca9 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java @@ -4,19 +4,24 @@ import java.util.concurrent.ThreadLocalRandom; public class Consumer implements Runnable { - private Store store; + private Mart store; private String name; private Random random; - public static int count = 0; - public Consumer(String name, Store store) { + private static int count = 0; + + public Consumer(String name, Mart store) { this.store = store; - this.name = name + ++count; + addCount(); + this.name = name + this.count; } public String getName() { return name; } + public void addCount() { + this.count = count + 1; + } @Override public void run() { @@ -42,7 +47,7 @@ private void sellRandomTime() { public void pickFoods() { int productNum = randomProductNum(); int amount = randomAmount(); - Product product = store.getFoodStand().getFoodsList().get(productNum); + Store product = store.getFoodStand().getFoodsList().get(productNum); store.getFoodStand().sell(product, amount); } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java index a4ba428..dc78b74 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java @@ -1,23 +1,20 @@ package com.nhnacademy.gaeun.assignment01; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; public class FoodStand { - private List productList; + private List productList; public FoodStand() { this.productList = new ArrayList<>(); } - public List getFoodsList() { + public List getFoodsList() { return this.productList; } - public void add(Product product, int amount) { + public void add(Store product, int amount) { if(productList.contains(product)) { product.add(amount); } else { @@ -25,7 +22,7 @@ public void add(Product product, int amount) { } } - public void sell(Product product, int amount) { //상품 판매 + public void sell(Store product, int amount) { //상품 판매 if(productList.contains(product)) { product.sell(amount); } else { diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java index 338024f..ca6c6a1 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java @@ -4,8 +4,8 @@ import java.util.concurrent.TimeUnit; public class Main { - public static void main(String[] args) throws InterruptedException { - Store store = new Store(); + public static void main(String[] args) { + Mart store = new Mart(); Producer producer = new Producer(store); Thread producerThread = new Thread(producer); ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Mart.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Mart.java new file mode 100644 index 0000000..b174cbf --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Mart.java @@ -0,0 +1,50 @@ +package com.nhnacademy.gaeun.assignment01; +import java.util.ArrayList; +import java.util.List; + +public class Mart { + private List people; + + private FoodStand foodStand; + + public static final int PEOPLE_NUM_LIMIT = 5; + + public Mart() { + people = new ArrayList<>(); + foodStand = new FoodStand(); + } + + public FoodStand getFoodStand() { + return foodStand; + } + + public synchronized boolean isAbleEnter() { + return people.size() < PEOPLE_NUM_LIMIT; + } + + public synchronized void enter(Consumer consumer) { + if (consumer == null) { + throw new IllegalArgumentException("consumer is null"); + } + while (!isAbleEnter()) { + try { + System.out.println("대기중입니다 ..."); + wait(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + people.add(consumer); + System.out.println(consumer.getName() + " enter"); + } + + public synchronized void exit(Consumer consumer) { + people.remove(consumer); + System.out.println(consumer.getName() + " exit"); + notifyAll(); + } + + public void addFoodStand(Store product, int amount) { + foodStand.add(product, amount); + } +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java index aec8106..4ac6229 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java @@ -7,13 +7,14 @@ import com.nhnacademy.gaeun.assignment01.product.*; public class Producer implements Runnable { - private Store store; - private List itemList; + private Mart store; + private List itemList; private Random random; - public Producer(Store store) { + public Producer(Mart store) { this.store = store; this.itemList = new ArrayList<>(); + this.random = new Random(); initialSetting(); } @@ -42,21 +43,19 @@ public void run() { private void randomDelivery() { int deliveryNum = randomDeliveryNum(); int amount = randomAmount(); - Product product = bringProduct(deliveryNum); - store.getFoodStand().add(product, amount); + Store product = bringProduct(deliveryNum); + this.store.addFoodStand(product, amount); } private int randomAmount() { - random = new Random(); - return random.nextInt(10) + 1; + return this.random.nextInt(10) + 1; } private int randomDeliveryNum() { - random = new Random(); - return random.nextInt(itemList.size()); + return this.random.nextInt(itemList.size()); } - private Product bringProduct(int deliveryNum) { - return itemList.get(deliveryNum); + private Store bringProduct(int deliveryNum) { + return this.itemList.get(deliveryNum); } } \ No newline at end of file diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java deleted file mode 100644 index 7251292..0000000 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Product.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.nhnacademy.gaeun.assignment01; -public class Product { - - private String name; - private int amount; - public static final int MAX_NUM = 30; - public Product(String name, int amount) { - this.name = name; - this.amount = amount; - } - public String getName() { - return name; - } - - public synchronized boolean isAbleBuy(int amount) { - if (amount > 30) { - System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); - return false; - } - if (this.amount + amount > MAX_NUM) { - System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); - return false; - } - return true; - } - - public synchronized boolean isAbleSell(int amount) { - return (this.amount - amount >= 0); - } - - public synchronized void add(int amount) { - while (!isAbleBuy(amount)) { - try { - wait(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - this.amount += amount; - System.out.printf("%s %d개가 가판대에 추가 되었습니다.\n", this.name, amount); - notifyAll(); - } - - public synchronized void sell(int amount) { //상품 판매 - while (!isAbleSell(amount)) { - try { - wait(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - } - if(isAbleSell(amount)) { - this.amount -= amount; - System.out.printf("%s %d개 구매 완료.\n", this.name, amount); - System.out.printf("남은 %s의 수량: %d\n", this.name, this.amount); - notifyAll(); - } - } -} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java index a3d77d7..ff545e1 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java @@ -1,49 +1,54 @@ package com.nhnacademy.gaeun.assignment01; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - public class Store { - private List people; - - private FoodStand foodStand; - public static final int PEOPLE_NUM_LIMIT = 5; + private String name; + private int amount; + private static final int MAX_NUM = 30; public Store() { - people = new ArrayList<>(); - foodStand = new FoodStand(); + this.name = ""; + this.amount = 0; + } + public Store(String name, int amount) { + this.name = name; + this.amount = amount; + } + public String getName() { + return name; } - public FoodStand getFoodStand() { - return foodStand; + public synchronized boolean isAbleBuy(int amount) { + if (this.amount + amount > MAX_NUM) { + System.out.println(this.name + "의 재고는 30개까지만 가능합니다."); + return false; + } + return true; } - public synchronized boolean isAbleEnter() { - return people.size() < PEOPLE_NUM_LIMIT; + public synchronized boolean isAbleSell(int amount) { + return (this.amount - amount >= 0); } - public synchronized void enter(Consumer consumer) { - if (consumer == null) { - throw new IllegalArgumentException("consumer is null"); + public synchronized void add(int amount) { + if (isAbleBuy(amount)) { + this.amount += amount; + System.out.printf("%s %d개가 가판대에 추가 되었습니다.\n", this.name, amount); + notifyAll(); } - while (!isAbleEnter()) { + } + + public synchronized void sell(int amount) { //상품 판매 + while (!isAbleSell(amount)) { try { - System.out.println("대기중입니다 ..."); wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } - people.add(consumer); - System.out.println(consumer.getName() + " enter"); - } - - public synchronized void exit(Consumer consumer) { - if (people.contains(consumer)) { - people.remove(consumer); - System.out.println(consumer.getName() + " exit"); + if(isAbleSell(amount)) { + this.amount -= amount; + System.out.printf("%s %d개 구매 완료.\n", this.name, amount); + System.out.printf("남은 %s의 수량: %d\n", this.name, this.amount); notifyAll(); } } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/StoreFactory.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/StoreFactory.java new file mode 100644 index 0000000..64d1d25 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/StoreFactory.java @@ -0,0 +1,6 @@ +package com.nhnacademy.gaeun.assignment01; + + +interface StoreFactory { + Store createStore(); +} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/factory/CannedFoodsFactory.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/factory/CannedFoodsFactory.java new file mode 100644 index 0000000..53e71a3 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/factory/CannedFoodsFactory.java @@ -0,0 +1,12 @@ +//package com.nhnacademy.gaeun.assignment01.factory; +// +//import com.nhnacademy.gaeun.assignment01.Store; +//import com.nhnacademy.gaeun.assignment01.StoreFactory; +//import com.nhnacademy.gaeun.assignment01.product.CannedFoods; +// +//public class CannedFoodsFactory implements StoreFactory { +// @Override +// public Store createStore() { +// return new CannedFoods(); +// } +//} diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java index d0e913c..3e86877 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java @@ -1,8 +1,12 @@ package com.nhnacademy.gaeun.assignment01.product; -import com.nhnacademy.gaeun.assignment01.Product; +import com.nhnacademy.gaeun.assignment01.Store; -public class CannedFoods extends Product { +public class CannedFoods extends Store { public CannedFoods(String name, int amount) { super(name, amount); } + + public CannedFoods() { + + } } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java index 4db1720..c9ab524 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java @@ -1,6 +1,6 @@ package com.nhnacademy.gaeun.assignment01.product; -import com.nhnacademy.gaeun.assignment01.Product; -public class DriedSeafood extends Product { +import com.nhnacademy.gaeun.assignment01.Store; +public class DriedSeafood extends Store { public DriedSeafood(String name, int amount) { super(name, amount); } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java index da93b46..f9bd005 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java @@ -1,6 +1,6 @@ package com.nhnacademy.gaeun.assignment01.product; -import com.nhnacademy.gaeun.assignment01.Product; -public class OtherItems extends Product { +import com.nhnacademy.gaeun.assignment01.Store; +public class OtherItems extends Store { public OtherItems(String name, int amount) { super(name, amount); } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java index fb87dc7..f81bf79 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java @@ -1,7 +1,7 @@ package com.nhnacademy.gaeun.assignment01.product; -import com.nhnacademy.gaeun.assignment01.Product; +import com.nhnacademy.gaeun.assignment01.Store; -public class ProcessedFood extends Product { +public class ProcessedFood extends Store { public ProcessedFood(String name, int amount) { super(name, amount); } diff --git a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java index a03b5ff..1f5a5b3 100644 --- a/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java @@ -1,7 +1,7 @@ package com.nhnacademy.gaeun.assignment01.product; -import com.nhnacademy.gaeun.assignment01.Product; +import com.nhnacademy.gaeun.assignment01.Store; -public class Vegetable extends Product { +public class Vegetable extends Store { public Vegetable(String name, int amount) { super(name, amount); }