스타크래프트 배럭을 예제로 삼아서 마린 생성을 쓰레드로 구현해보자.
메뉴 1번을 입력하게 되면 마린 클래스와 쓰레드를 상속받은 객체에서 쓰레드를 실행하고 현재 생성이 완료되었는지 아닌지를 판별하는 기능을 만들어보자.
package MyThread;
import out.production.day6.MarineEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MarineExample {
static List<Marien> list = new ArrayList<>();
static int idx;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("1. 마린 생성 하기");
System.out.println("2. 마린 생성 내역 확인하기");
System.out.println("3. 종료");
System.out.print("입력 : ");
int menu = sc.nextInt();
switch (menu) {
case 1:
System.out.println("마린을 생성 합니다 ...");
// ENUM 속성 사용해서 마린클래스 생성..
Marien m = new Marien(idx, MarineEnum.ING);
list.add(m);
// 쓰레드에 마린클래스를 같이 넣어서 생성
MarineThread mt = new MarineThread(m);
mt.start();
idx++;
break;
case 2:
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).idx + "번째 마린 : " + list.get(i).status);
}
break;
case 3:
System.out.println("종료..");
return;
default:
System.out.println("잘못된 메뉴를 선택 하셨습니다. 다시 선택 해 주세요.");
break;
}
}
}
public static class Marien {
private int idx;
private MarineEnum status;
public Marien(int idx, MarineEnum status) {
this.idx = idx;
this.status = status;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public MarineEnum getStatus() {
return status;
}
public void setStatus(MarineEnum status) {
this.status = status;
}
}
}
import out.production.day6.MarineEnum;
public class MarineThread extends Thread {
private MarineExample.Marien marien;
public MarineThread(MarineExample.Marien marien) {
this.marien = marien;
}
@Override
public void run() {
try {
Thread.sleep(8000); // 8초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
// 마린 클래스의 상태를 변경해주자..
marien.setStatus(MarineEnum.END);
}
}