KoreaIt Academy/JAVA 예제

멀티 쓰레드와 싱글턴(singleton)을 사용한 빵집 예제

hongeeii 2021. 7. 28.
728x90
반응형

1. 싱글턴 클래스 BreadPlate

2. Runnable 구현 클래스 BreadMaker

3. 실행 클래스 Bakery

 

//1초에 하나씩 빵을 만드는 빵집이 있습니다.

//빵이 10개 이상이면 빵이 가득찼다 출력 && 멈춤

//빵을 20개 먹으면 빵이 다 떨어졌다 출력

//빵을 다먹어서 남아있는빵이 0개이하면 빵을 만들고 있다 출력

 

//빵을 만들고 먹는 메소드 작성

 

//싱글톤을 사용하지 않으면 Runnable구현클래스의 run()메소드에서의 빵을 만드는 객체와

// 실행 클래스의 빵을 먹는 객체가 서로 다르게됨-> 따라서 단 하나의 공유객체의 필요성을 느낌

 

//Runnable 구현 클래스 : 멀티 스레드로 만들어 1초마다 빵을 만들게 함

//실행 클래스에서 빵먹기 구현

 

 

BreadPlate

public class BreadPlate {
	//싱글턴 패턴
	private static BreadPlate plate;
	
	public int breadCnt;
	public int eatCnt;
	
	private BreadPlate() {;}
	
	public static BreadPlate getInstance() {
		if(plate == null) {
			plate = new BreadPlate();
		}
		return plate;
	}
	
    //////////////////synchronized(동기화)하는 이유는 멀티쓰레드가 동시에 사용하지 못하도록!
	//빵만들기
	public synchronized void makeBread() {
		if(breadCnt > 9) {
			System.out.println("빵이 가득 찼습니다.");
			try {wait();} catch (InterruptedException e) {;}  //실행중인 스레드 정지
		}
		breadCnt++;
		System.out.println("빵을 1개 만들었습니다. 총 :" + breadCnt + "개");
	}
	
	//빵먹기
	public synchronized void eatBread() {
		if(eatCnt == 20) {
			System.out.println("빵이 다 떨어졌습니다.");
		}else if(breadCnt < 1) {
			System.out.println("🥐🥯🍪🍪🍩🍩🍩🥖 빵을 만들고있어요 !");
		}else {
			breadCnt--;
			eatCnt++;
			System.out.println("빵을 1개 먹었습니다. 총 :" + breadCnt + "개");
			notify();   ///정지상태에 있는 스레드를 실행상태로 변경
		}
	}
}

 

 

BreadMaker

public class BreadMaker implements Runnable{
   private boolean exit;
   
   ///외부에서 exit값을 받아와 나가기버튼을 눌렀을 때 run()메소드를 종료하기 위함
   public boolean isExit() {
      return exit;
   }

   public void setExit(boolean exit) {
      this.exit = exit;
   }

   @Override
   public void run() {
      for (int i = 0; i < 20; i++) {
         if(exit) {break;}
         BreadPlate.getInstance().makeBread(); ////싱글톤객체 생성, 메소드 접근
         try {Thread.sleep(1000);} catch (InterruptedException e) {;} 
      }
   }
}

 

Bakery

public class Bakery {
	public static void main(String[] args) {
		BreadMaker maker = new BreadMaker();  ////Runnable 구현객체
		Thread makeThread = new Thread(maker); ///Thread생성
		
		ImageIcon icon = new ImageIcon("src/img/bread.gif");   
				
		
		String[] btns = {"빵 먹기", "나가기"};
		int choice = 0;
		
		makeThread.start();    ///Thread run()메소드 시작!
		
		while(true) {
			choice = JOptionPane.showOptionDialog(null, "", "빵집", JOptionPane.DEFAULT_OPTION,
					JOptionPane.PLAIN_MESSAGE, icon, btns, null);
			
			if(choice == 0) {   ////버튼의 첫번째 = 빵먹기
				BreadPlate.getInstance().eatBread();
			}else {  //// 버튼의 두번째 = 나가기
//				System.exit(0);
				maker.setExit(true);   ////BreadMaker의 run()메소드를 종료시키는 메소드
				break;
			}
		}
	}
}

 

 

결과

 

728x90
반응형

추천 글