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
}
}
}
}
'JAVA > HIGH JAVA' 카테고리의 다른 글
[JAVA] 입출력( I/O ) - File객체 (0) | 2024.05.02 |
---|---|
[JAVA] 스레드 - 공통 객체 / 동기화 (1) | 2024.05.01 |
[JAVA] 스레드 - 데몬스레드/상태/yield/종료 (0) | 2024.04.30 |
4/29 Homework - 가위바위보 게임 (0) | 2024.04.29 |
[JAVA] 스레드 (0) | 2024.04.29 |