본문 바로가기

JAVA/JAVA_2

Chap06-1 쓰레드 예시

-진열장(공간 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());
	}
}