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..fd2dca9 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Consumer.java @@ -0,0 +1,64 @@ +package com.nhnacademy.gaeun.assignment01; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class Consumer implements Runnable { + private Mart store; + private String name; + private Random random; + + private static int count = 0; + + public Consumer(String name, Mart store) { + this.store = store; + addCount(); + this.name = name + this.count; + } + + public String getName() { + return name; + } + public void addCount() { + this.count = count + 1; + } + + @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(); + Store 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..dc78b74 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/FoodStand.java @@ -0,0 +1,32 @@ +package com.nhnacademy.gaeun.assignment01; +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(Store product, int amount) { + if(productList.contains(product)) { + product.add(amount); + } else { + productList.add(product); + } + } + + public void sell(Store 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..ca6c6a1 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Main.java @@ -0,0 +1,20 @@ +package com.nhnacademy.gaeun.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) { + Mart store = new Mart(); + 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/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 new file mode 100644 index 0000000..4ac6229 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Producer.java @@ -0,0 +1,61 @@ +package com.nhnacademy.gaeun.assignment01; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import com.nhnacademy.gaeun.assignment01.product.*; + +public class Producer implements Runnable { + private Mart store; + private List itemList; + private Random random; + + public Producer(Mart store) { + this.store = store; + this.itemList = new ArrayList<>(); + this.random = new Random(); + 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(); + Store product = bringProduct(deliveryNum); + this.store.addFoodStand(product, amount); + + } + private int randomAmount() { + return this.random.nextInt(10) + 1; + } + + private int randomDeliveryNum() { + return this.random.nextInt(itemList.size()); + } + + 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/Store.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java new file mode 100644 index 0000000..ff545e1 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/Store.java @@ -0,0 +1,55 @@ +package com.nhnacademy.gaeun.assignment01; +public class Store { + + private String name; + private int amount; + private static final int MAX_NUM = 30; + + public Store() { + this.name = ""; + this.amount = 0; + } + public Store(String name, int amount) { + this.name = name; + this.amount = amount; + } + public String getName() { + return name; + } + + 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 isAbleSell(int amount) { + return (this.amount - amount >= 0); + } + + public synchronized void add(int amount) { + if (isAbleBuy(amount)) { + 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/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 new file mode 100644 index 0000000..3e86877 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/CannedFoods.java @@ -0,0 +1,12 @@ +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Store; + +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 new file mode 100644 index 0000000..c9ab524 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/DriedSeafood.java @@ -0,0 +1,7 @@ +package com.nhnacademy.gaeun.assignment01.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 new file mode 100644 index 0000000..f9bd005 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/OtherItems.java @@ -0,0 +1,7 @@ +package com.nhnacademy.gaeun.assignment01.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 new file mode 100644 index 0000000..f81bf79 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/ProcessedFood.java @@ -0,0 +1,8 @@ +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Store; + +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 new file mode 100644 index 0000000..1f5a5b3 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment01/product/Vegetable.java @@ -0,0 +1,8 @@ +package com.nhnacademy.gaeun.assignment01.product; +import com.nhnacademy.gaeun.assignment01.Store; + +public class Vegetable extends Store { + 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..9171e10 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Consumer.java @@ -0,0 +1,59 @@ +package com.nhnacademy.gaeun.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..2bc6757 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/FoodStand.java @@ -0,0 +1,34 @@ +package com.nhnacademy.gaeun.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..9c55418 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Main.java @@ -0,0 +1,22 @@ +package com.nhnacademy.gaeun.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..1c4244a --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Producer.java @@ -0,0 +1,63 @@ +package com.nhnacademy.gaeun.assignment02; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import com.nhnacademy.gaeun.assignment02.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/assignment02/Product.java b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java new file mode 100644 index 0000000..f73993c --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Product.java @@ -0,0 +1,61 @@ +package com.nhnacademy.gaeun.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..c06081b --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/Store.java @@ -0,0 +1,45 @@ +package com.nhnacademy.gaeun.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..da8335d --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/CannedFoods.java @@ -0,0 +1,9 @@ +package com.nhnacademy.gaeun.assignment02.product; + +import com.nhnacademy.gaeun.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..d9e18a2 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/DriedSeafood.java @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..ca6ef72 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/OtherItems.java @@ -0,0 +1,9 @@ +package com.nhnacademy.gaeun.assignment02.product; + +import com.nhnacademy.gaeun.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..aa4848b --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/ProcessedFood.java @@ -0,0 +1,9 @@ +package com.nhnacademy.gaeun.assignment02.product; + +import com.nhnacademy.gaeun.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..b1a3ca0 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/assignment02/product/Vegetable.java @@ -0,0 +1,10 @@ +package com.nhnacademy.gaeun.assignment02.product; + + +import com.nhnacademy.gaeun.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..e079e1f --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Consumer.java @@ -0,0 +1,35 @@ +package com.nhnacademy.gaeun.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..25f5f05 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Main.java @@ -0,0 +1,27 @@ +package com.nhnacademy.gaeun.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..201cc4b --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Producer.java @@ -0,0 +1,24 @@ +package com.nhnacademy.gaeun.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..1156a7e --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Product.java @@ -0,0 +1,4 @@ +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 new file mode 100644 index 0000000..23e3889 --- /dev/null +++ b/Thread/src/main/java/com/nhnacademy/gaeun/example/Store.java @@ -0,0 +1,78 @@ +package com.nhnacademy.gaeun.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(); + } + } +}