JAVA/HIGH JAVA

4/30 Homework - 경마 프로그램

아잠만_ 2024. 4. 30. 12:41

  10마리의 말들이 경주하는 경마 프로그램을 작성하시오.
 
  말은 Horse라는 이름의 스레드 클래스로 작성하는데
  이 클래스 말 이름(String), 등수(int), 현재위치(int)를 멤버 변수로 갖는다.
  그리고 이 클래스에는 등수를 오름차순으로 처리하는 내부 정렬 기준이 있다
  (Comparable 인터페이스 구현)
 
  경기 구간은 1~50 구간으로 되어 있다.
 
  경기가 끝나면 등수 순으로 정렬하여 출력한다.
 
  경기 중 중간 중간에 각 말들의 위치를 출력하시오.
 
  예시)
  01번말이름 : ------->------------------------------------------
  02번말이름 : --------------------------------------------------
  ...
  10번말이름 : ----------------------->--------------------------


package kr.or.ddit.basic;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/*
 	10마리의 말들이 경주하는 경마 프로그램을 작성하시오.
 	
 	말은 Horse라는 이름의 스레드 클래스로 작성하는데
 	이 클래스 말 이름(String), 등수(int), 현재위치(int)를 멤버 변수로 갖는다.
 	그리고 이 클래스에는 등수를 오름차순으로 처리하는 내부 정렬 기준이 있다
 		(Comparable 인터페이스 구현)
 		
 	경기 구간은 1~50 구간으로 되어 있다.
 	
 	경기가 끝나면 등수 순으로 정렬하여 출력한다.
 	
 	경기 중 중간 중간에 각 말들의 위치를 출력하시오.
 	
 	예시)
 	01번말이름 : ------->------------------------------------------
 	02번말이름 : --------------------------------------------------
 	...
 	10번말이름 : ----------------------->--------------------------
 */
public class ThreadTest12 {

	public static void main(String[] args) {
		List<Horse> horseList = new ArrayList<>(); 
		for(int i=1; i<=10; i++) {
			String name = "";
			if(i<10) {
				name+="0";
			}
			name+=i+"번 마";
			horseList.add(new Horse(name));
		}		
		
		for (Horse h : horseList) {
			h.start();
		}
		
		Thread state = new State(horseList);
		state.setDaemon(true);
		state.start();
		for (Horse h : horseList) {
			try {
				h.join();
			} catch (InterruptedException e) {
			}
		}
		System.out.println("---- 결 과 ----");
		Collections.sort(horseList);
		for (Horse h : horseList) {
			System.out.println(h.getRank() + "위 :" + h.getHorseName());
		}
	}
	
}

class Horse extends Thread implements Comparable<Horse> {
	public static int totalRank = 1; // 작업을 끝낸 순서대로 이름이 저장될 변수
	private String name;
	private int rank;
	private int loc;

	// 생성자
	public Horse(String name) {
		this.name = name;
		this.loc = 1;
	}

	public String getHorseName() {
		return name;
	}

	public void setHorseName(String name) {
		this.name = name;
	}

	public int getRank() {
		return rank;
	}

	public void setRank(int rank) {
		this.rank = rank;
	}

	public int getLoc() {
		return loc;
	}

	public void setLoc(int loc) {
		this.loc = loc;
	}
	
	// 랜덤한 시간대로 1이 더해지는 프로그램
	@Override
	public void run() {
		for (int i = 1; i <= 50; i++) {
			setLoc(i);
			try {
				Thread.sleep(new Random().nextInt(500));
			} catch (InterruptedException e) {
				// TODO: handle exception
			}
		}
		setRank(totalRank++);
	}
	
	// 순위를 기준으로 정렬
	@Override
	public int compareTo(Horse h1) {
		return new Integer(this.getRank()).compareTo(h1.getRank());
	}
}

// 현재 경기 경과를 보여주는 스레드 (데몬스레드 설정)
class State extends Thread{
	private List<Horse> horseList;
	
	public State(List<Horse> horseList) {
		this.horseList = horseList;
	}
	@Override
	public void run() {
		while(true) {
		System.out.println("\t\t------ 현재 경기 경과 ------");
		for (Horse h : horseList) {
			System.out.print(h.getHorseName() + " : ");
			for (int i = 1; i <= 50; i++) {
				if (h.getLoc() == i) {
					System.out.print(">");
				} else {
					System.out.print("-");
				}
			}
			System.out.println();
		}
		System.out.println();
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO: handle exception
		}
		}
	}
}