경주마 5마리가 100미터 달리기를 하는 멀티스레드 프로그램을 작성하시오.

1. 말(Horse클래스) 을 Thread를 상속받아 멀티 스레드로 작성한다.
2. for문{
말이름 + 현재 몇 미터 위치에 있는지 20미터 간격으로 출력한다.
}
3. 도착지점(100미터 지점)에서 어떤 말이 몇등으로 도착했는지
순위까지 출력한다. sleep(10)정도
4. 공유영역에
int rank; 순위필드
메소드내에서 synchronized(this){}를 사용하지 않고
메소드자체를 synchronized 형태로 선언한다.

 

공유영역인 Rank class

class Rank {
	int rank=0;
	
	synchronized void finishLine(String name){
		rank+=1;
		System.out.println(name+"말이 "+rank+"등으로 100m에 도착했습니다.");//최종 100m 도착 및 등수 출력
	}
}

 

 

경주마 스레드 Horse class

import java.util.*;
class Horse extends Thread {
	String h_name;
	int meter=0;
	int rank=0;
	Rank r = new Rank();
	
	Horse(String name, Rank r){		//생성자 파라미터값으로 공유영역 Rank 객체를 받음
		h_name=name;
		this.r=r;
	}
	
	public void run(){
		Random ran = new Random();
		for(int i=0;i<5;i++){
			meter+=20;
			if(i==4) break;
			System.out.println(h_name+"말이 현재 "+meter+"m에 있습니다.");
			try{
				int num=ran.nextInt(5000)+1000;
				Thread.sleep(num);
			}catch(Exception e){}
		}
		r.finishLine(h_name);
		
	}	
}

 

main메소드가 있는 HorseEx1 class

class HorseEx1{
	public static void main(String[] args) {
		Rank r=new Rank();	//공유영역(객체)을 선언
		Thread h1 = new Horse("1번",r); //같은 공유영역(객체)를 받아서 스레드를 생성
		Thread h2 = new Horse("2번",r); 
		Thread h3 = new Horse("3번",r); 
		Thread h4 = new Horse("4번",r);
		Thread h5 = new Horse("5번",r);

		h1.start();
		h2.start();
		h3.start();
		h4.start();
		h5.start();
	}
}