본문 바로가기

Java

Java Eclipse 로 Thread 구현

안녕하세요 오늘은 자바 Thread를 직접 프로그래밍해 보려고합니다

Thread를 구현하는 방법에는 두가지가 있습니다. 

Thread 클래스 상속 

Runnable 인터페이스를 구현

위의 두 가지 방법이 있습니다. 

public class Thread_Test {
	//쓰레드를 구현한느 방법은 Thread클래스를 상속받는 방법과 Runnable인터페이스를 
	//구현하는 방법 두가지가 있다 

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ThreadEX1_1 t1 =  new ThreadEX1_1();
		
		Runnable r = new  ThreadEx1_2();  //ThreadEx1_2의 인스턴스 r 을 생성
		
		Thread t2 = new Thread(r);
		
		t1.start();
		t2.start();
				
	}	

}

//Thread 클래스를 상속받는 경우 
class ThreadEX1_1 extends Thread {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i =0; i < 5; i++) {
			System.out.println(getName()); //조상인 Thread의 getName()을 호출
		}
	}
	
}
//ThreadEx1_2 Runable 인터페이스를 구현한 경우
class ThreadEx1_2 implements Runnable {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		for(int i = 0; i< 5; i++) {
			//Thread.currentThread() 현재 실행중인 Thread를 반환한다
			System.out.println(Thread.currentThread().getName()); //현재 실행중인 Thread를 반환한다 
		}
		
	}
}

 

실행결과 

 

저는 Thread_Test 라는 클래스를 만들고 진행 하였습니다 

위에서 알게된 사실은

Thread 클래스를 상속해서 쓰레드를 구현하는 방법과 

Runnable 인터페이스를 구현해서 쓰레드를 구현하는 방법이  다르다는 것을 알게되었습니다 .

 

위의 코드를 보시면 알겠지만 Thread 클래스를 상속하여 쓰레드를 만드는경우는 상속받은 클래스를 다시 불러와서 

Start 로 실행시키면 된다는점 

 

Runnable 인터페이스를 이용하여 Thread를 구현한경우는 

하나의 별도의 쓰레드를 만들어서 구현한 인터페이스를 변수로 넣어줘야한다는 점입니다. 

 

조금더 자세히 정리하자면 

Runnable 인터페이스를 구현한경우 

Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음 

생성된 인스턴스를 가지고 Thread클래스의 인스턴스를 생성할때 생성자의 매개변수로 제공 해야한다 

(이때 새용되는 Thread클래스의 생성자는 Thread(Runnable target)로 호출시에 Runnable인터페이스를 구현한 클래스이 인스턴스를 넘겨줘야한다.)

 

public class Thread {
	
	private Runnable r; //Runnable을 구현한 클래스의 인스턴스를 참조하기 위한 변수를 선언 
	
	public Thread(Runnable r) {
		this.r = r;
	}
	
	public void run() {
		if(r!=null) {
			r.run(); //Runnable 인터페이스를 구현한 인스턴스의 run()을 호출한다
		}
	}
	
} 
...

위의 예제랑 비교해보면서 보면 더욱 좋은 예제를 가져와봤습니다 

인스턴스변수로 Runnable타입의 변수 r을 선언해 놓고 생성자를 통해서 Runnable인터페이스를 구현한 인스턴스를 참조하도록 되어있는 것을 확인할 수있다. 

run()을 호출하면 참조변수 r을 통해서 Runnable인터페이스를 구현한 인스턴스의 run()이 호출된다. 

이렇게 함으로써 run()을 오버라이딩 하지않고 외부로부터 제공받을 수 있게된다 

 

 

도우출판 Java의 정석 이라는 책에서 내용을 가져왔습니다

'Java' 카테고리의 다른 글

자바 프로세스와 쓰레드의 차이점과 정의  (0) 2019.09.09