KoreaIt Academy/JAVA 예제
멀티 쓰레드와 싱글턴(singleton)을 사용한 빵집 예제
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
반응형
'KoreaIt Academy > JAVA 예제' 카테고리의 다른 글
Stream을 사용한 예제 (0) | 2021.07.27 |
---|---|
Encrypt : 암호화 간단한 예제 (0) | 2021.07.22 |
람다식 심화 실습 문제 - 계산기 (0) | 2021.07.22 |
익명클래스와 Adapter을 활용한 옷가게 예제 (0) | 2021.07.20 |
은행 예제 ★★★★★ (0) | 2021.07.20 |
댓글