본문 바로가기

Java

[exam16] 스레드 상속, Runnable 인터페이스

스레드 상속

class TimeCounter extends Thread{
	private int count = 0;
	private String name;
	
	public TimeCounter(int count, String name) {
		this.count = count;
		this.name = name;
	}
	
	public void countStart() {
		while(count > 0) {
			System.out.println(this.name + " 카운트 - " + this.count);
			this.pause(1000);
			this.count--;
		}
	}
	//쓰레드 상속 시 반드시 런 구현
	@Override
	public void run() {
		//쓰레드로 작업할 코드 작성
		this.countStart();
	}
	
	private void pause(long millis) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	
	}
}

public class Sample1 {
	
	public static void main(String[] args) {
		TimeCounter t1 = new TimeCounter(5, "t1");
		TimeCounter t2 = new TimeCounter(3, "t2");
		TimeCounter t3 = new TimeCounter(4, "t3");
		
		/*
		t1.countStart();		//1 2 3 순차적으로 소요, 5+3+4 = 12초 
		t2.countStart();		  
		t3.countStart();
		*/
		
		//멀티쓰레드 동시에 한번에 실행, 5초면 끝남 
		t1.start(); 
		t2.start();
		t3.start();
		//쓰레드에 정의 되어있는 스타트 , 스타트 하게 되면 스레드가 만들어지고 내부의 런 실행 
		//스타트가 실행되야지 런을 직접 실행하면 안됨 스타트 해야 new Thread 만들어짐 그리고 
		//그 안에서 런 실행되는 것 
	}

}

 

Runnable 인터페이스

 

class TimeCounter2 implements Runnable {		// Runnable 이용 
	private int count = 0;
	private String name;
	
	public TimeCounter2(int count, String name) {
		this.count = count;
		this.name = name;
	}
	
	public void countStart() {
		while(count > 0) {
			System.out.println(this.name + " 카운트 - " + this.count);
			this.pause(1000);
			this.count--;
		}
	}
	//쓰레드 상속 시 반드시 런 구현
	@Override
	public void run() {
		//쓰레드로 작업할 코드 작성
		this.countStart();
	}
	
	private void pause(long millis) {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	
	}
}
enum Type {	//이넘상수 정의하는 그자체로 상수화 되는것
	NUMBER, POINT, STR, WEIGHT, HEIGHT
}

public class Sample2 {
	
	public static void main(String[] args) {
		Type t = Type.NUMBER;
		System.out.println("이넘상수 : " + t);
		
		System.out.println("메인 쓰레드의 메인 메서드 실행");
		
		TimeCounter2 t1 = new TimeCounter2(5, "t1");
		TimeCounter2 t2 = new TimeCounter2(3, "t2");
		TimeCounter2 t3 = new TimeCounter2(4, "t3");
		
		Thread thread1 = new Thread(t1);
		Thread thread2 = new Thread(t2);
		Thread thread3 = new Thread(t3);
		
		//getState(); 스레드의 상태 알려줌
		System.out.println(thread1.getState());	//NEW
		thread1.start();
		System.out.println(thread1.getState());	//RUNABLE

		while(true) {
			try {			//1초 간격
				Thread.sleep(1000);		//Runable 동작가능 상태, Wait 기다리는 중
				System.out.println(thread1.getState());
				if(thread1.getState() == State.TERMINATED) {
					System.out.println(thread1.getState());//Terminated 쓰레드종료
					break;														
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			thread1.getState();
			
		}
		thread2.start();
		thread3.start();
		
		System.out.println("메인 쓰레드의 메인 메서드 종료");
		//main메서드 실행되면 메인에 의해 생성된 스레드들은 독립적으로 저장되어 실행중인 것
	}

}