중급과정/HighJava

[Java] Thread(스레드)를 이용한 알파벳 대문자 출력과 출력순대로 순위 매기는 프로그램 작성예제

whalerice 2023. 11. 29. 21:34
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class T11DisplayCharacterTest {
/*
 	3개(명)의 스레드가 각각 알파벳 대문자를 출력하는데...
 	출력을 끝낸 순서대로 결과를 출력하는 프로그램 작성하기
*/
	static int CURR_RANK = 1;  //현재 순위정보
	
	public static void main(String[] args) {
		
		 List<DisplayCharacter> disCharList = 
				 new ArrayList<DisplayCharacter>();
			disCharList.add(new DisplayCharacter("홍길동"));
			disCharList.add(new DisplayCharacter("둘리"));
			disCharList.add(new DisplayCharacter("희동이"));
			disCharList.add(new DisplayCharacter("마이콜"));

			for (Thread th : disCharList) {
				th.start();
			}
			
			//경기결과가 마지막에 나오게 하기위해 조인을 넣어줌 
			for (Thread th : disCharList) {
				try {
					th.join();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			
			System.out.println("경기 끝...");
			
			Collections.sort(disCharList); //정렬기능 사용
			
			System.out.println("--------------------------------");
			System.out.println(" 경기 결과");
			System.out.println("");
			System.out.println("=================================");
			System.out.println(" 순위\t:\t이름");
			System.out.println("---------------------------------");
			for(DisplayCharacter dc : disCharList) {
				System.out.println(" " + dc.getRank() + "\t:\t" + dc.getName());
			}
		}
	}

// 알파벳 대문자 출력을 위한 스레드								//우리가 다루는 타입<>
class DisplayCharacter extends Thread implements Comparable<DisplayCharacter> {
	private String name;
	private int rank;	// 순위
	
	
	
	
	//랭크만 선택해서 게터세터
	public int getRank() {
		return rank;
	}

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

	
	public DisplayCharacter(String name) {
		super(name); // 스레드 이름 지정
		this.name = name;
	}
	
	@Override
	public void run() {
		for(char ch='A'; ch<='Z'; ch++) {
			System.out.println(name + "의 출력 문자 : " + ch);
			
			try {
				// sleep()메서드의 시간을 200~500 사이의 난수로 설정함.
				Thread.sleep((int) (Math.random() * 301 + 200));
			}catch(InterruptedException ex) {
				ex.printStackTrace();
			}
		}
		System.out.println(name + " 출력 끝...");
		
		this.setRank(T11DisplayCharacterTest.CURR_RANK++);
	}

	@Override			//랭크 기준으로 오름차순 정렬기능 부여 
	public int compareTo(DisplayCharacter dc) {
		
		return Integer.compare(this.getRank(), dc.getRank());
	}
	
	
	
}