자바/프로세스와 쓰레드

쓰레드의 기본적 구현과 실행

백_곰 2022. 2. 14. 14:57

1. 쓰레드의 구현 방식

- 쓰레드 구현의 방식은 두 가지가 있는데, Thread 클래스를 상속받는 방법과 Runnable 인터페이스

구현하는 방법이 있다.

( 어느 쪽이든 별 차이는 없지만 Thread를 상속받는다면 다른 클래스를 상속 못 받기 때문에, 인터페이스로

구현하는 것이 일반적이다. )

( 인터페이스 구현은 재사용이 높고 일관성을 유지하기에 객체지향적 방법이라고 말할 수 있다. )

 

 

 

 

1-1. 쓰레드 구현을 이해하기 위한 예제(1)

: 상속을 받는 것과 인터페이스를 구현하는 방법을 알아보는 예제이다.

 

import java.util.*;

public class Exercise001 {
	public static void main(String[] args) {
		ThreadEx1 t1 = new ThreadEx1();
		
		Runnable r1 = new ThreadEx2();
		Thread t2 = new Thread(r1);
		//= Thread t2 = new Thread(new ThreadEx2);
		
		t1.setName("Thread 쓰레드");
		t1.start();
		
		t2.setName("Runnable 쓰레드");
		t2.start();
	}
}

class ThreadEx1 extends Thread{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println(getName());
		}
	}
}

class ThreadEx2 implements Runnable{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println(Thread.currentThread().getName());
			//Thread t = Thread.currentThread();
			//println(t.getName()); 
		}
	}
}

 

( run()을 실행해야 돌아갈 거 같은 쓰레드는 run()을 호출하지 않고, start()을 통해 실행해야 돌아간다. )

( 또한 start()가 실행되었다고 무조건 실행되지 않는다. 그 이유는 앞에 쓰레드가 있었다면 대기상태로 대기

해야하기 때문이다. )

 

( 한 가지 알아두어야 할 점은 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다. )

( 그래서 한 번 실행된 인스턴스를 다시 new 를 통해서 다시 생성 후 실행시킨다. 만약 이것을 어긴다면,

IllegalThreadStateException이 발생한다. )

 

 

 

 

2. start()와 run()

- start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택을 생성한다.

 

- run()은 start()가 만들어준 호출스택에서 첫 번째로 올라가게 한다.

 

- 아래는 start()run() 수행 시, 일어는 과정을 설명한다.

( (4)번에서는 최종적으로 쓰레드를 생성한 상태이며, 스케줄러가 정한 순서에 의해서

번갈아 가면서 실행한다. )

 

( 또한 위의 호출스택은 실행중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다. )

 

( 만약 main 스택에서 run()을 호출한다면, 새로운 쓰레드가 생성되지 않고 바로 main 스택에

올라오게 된다. )