-진열장(공간 5개 list)
-제빵사 1, 2, 3 세 명이 있다 진열장이 꽉차면 빵을 그만 만든다
-소비자 1, 2, 3 케잌 살때 진열장에 없으면 빵을 못 산다
-진열장 5개 채워졌을 때, 제빵사 stop\ 소비자 구매→제빵사 start
-진열장 0칸으로 비워져 있을 때 소비자 stop제빵사 생산→소비자 start
사는행위 : 소비자
만드는행위 : 베이커
관리(critic section) : Manager
package Bread_Thread;
public class BakeryMain {
public static void main(String[] args) {
Manager mgr=new Manager();
Baker b1=new Baker("홍길동", mgr);
Baker b2=new Baker("청길동", mgr);
Baker b3=new Baker("백길동", mgr);
Baker b4=new Baker("흑길동", mgr);
Customer c1=new Customer("이소비", mgr);
Customer c2=new Customer("강소비", mgr);
Customer c3=new Customer("황소비", mgr);
Customer c4=new Customer("박소비", mgr);
Customer c5=new Customer("지소비", mgr);
Customer c6=new Customer("김소비", mgr);
b1.start();
b2.start();
b3.start();
b4.start();
c1.start();
c2.start();
c3.start();
}
}
package Bread_Thread;
public class Baker extends Thread{
private String chefName;
private Manager mgr;
public String getChefName() {
return chefName;
}
public void setChefName(String chefName) {
this.chefName = chefName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
public Baker(String chefName, Manager mgr) {
super();
this.chefName = chefName;
this.mgr = mgr;
}
public String getBread() {
int num=(int)Math.random()*4;
String[] bread_arr= {"피자빵","소보로","고로케","크림빵"};
return bread_arr[num];
}
public Baker() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
mgr.addBread(chefName, getBread());;
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package Bread_Thread;
public class Customer extends Thread{
private String cusInfo;
private Manager mgr;
public Customer() {
// TODO Auto-generated constructor stub
}
public Customer(String cusInfo, Manager mgr) {
super();
this.cusInfo = cusInfo;
this.mgr = mgr;
}
public String getCusInfo() {
return cusInfo;
}
public void setCusInfo(String cusInfo) {
this.cusInfo = cusInfo;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
mgr.buyBread(cusInfo);
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package Bread_Thread;
import java.util.ArrayList;
public class Manager {
ArrayList<String> list=new ArrayList<String>();
public Manager() {
// TODO Auto-generated constructor stub
}
public synchronized void addBread(String chefName,String bread) {
while(list.size()>=5) {
System.out.println("빵 만들기 전 진열장의 빵 갯수:"+list.size());
try {
this.wait();
System.out.println(chefName+" 제빵사 대기 중!!!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
list.add(bread);
this.notify();
System.out.println(chefName+"빵 만든 후 진열장의 빵 갯수"+list.size());
}
public synchronized void buyBread(String cusName) {
while(list.size()<=0) {
System.out.println("빵 구매 전 진열장의 빵 갯수"+list.size());
try {
this.wait();
System.out.println(cusName+" 빵 대기 중!!!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String bread=list.get(0);
list.remove(0);
this.notify();
System.out.println(cusName+"가 " +bread+" 구매 후 진열장의 빵 갯수"+list.size());
}
}
'JAVA > JAVA_2' 카테고리의 다른 글
Chap06.쓰레드 (IllegalThreadStateException 예외 존재) (0) | 2021.02.08 |
---|---|
Chap05. File 클래스 (디렉토리도 파일객체가 될 수 있다) (0) | 2021.02.05 |
Chap04-04_ObjectOutputStream ObjectInputStream 입출력 사용 (0) | 2021.02.05 |
Chap04-03_입출력 사용 예시 보조(filter)스트림(BufferReader, BufferWriter) (0) | 2021.02.05 |
Chap04-02_입출력 사용 예시 그림,파일(InputStream, OutputStream) (0) | 2021.02.04 |