Java/객체지향

[객체지향][쓰레드/thread] - 쓰레드구현과 실행

얄루몬 2022. 2. 26. 16:30

https://youtu.be/P1zDndoy4pI?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[쓰레드의 구현과 실행]

  1. Thread 클래스를 상속
    • 자바는 단일 상속만 허용하기에 인터페이스로 구현하는 것이 낫다.
  2. Runnable 인터페이스를 구현

 

[쓰레드를 구현하는 방법 2가지를 이용한 쓰레드 구현]

package javajungsuk;

public class Java13_1 {

	public static void main(String[] args) {
		ThreadEx1_1 t1 = new ThreadEx1_1();
		
		Runnable r = new ThreadEx1_2();
		Thread t2 = new Thread(r); // 생성자 Thread(Runnable target)
		
		t1.start();
		t2.start();
	}
}

class ThreadEx1_1 extends Thread{ //Thread 클래스 상속해서 쓰레드 구현
	public void run() {
		for(int i = 0; i < 5; i ++) {
			//상속받은 것이기 때문에 이렇게 접근하느 것 this 생략 가능
			System.out.println(this.getName()); // 조상인 쓰레드의 getName() 호출
		}
	}
}

class ThreadEx1_2 implements Runnable{ //Runnable 인터페이스를 구현해서 쓰레드 구현
	public void run() { //쓰레드가 수행할 작업 작성
		for(int i = 0; i < 5; i++) {
			//Thread.currentThread() - 현재 실행중인 Thread를 반환.
			//상속 받지 않아서 이렇게 접근하는 것이다.
			System.out.println(Thread.currentThread().getName());
		}
	}
}

 

 

[쓰레드의 실행 - start( )]

  • 쓰레드 생성한 후에 start( )를 호출해야 쓰레드가 작업을 시작한다.
ThreadEx1_1 t1 = new ThreadEx1_1(); // 생성
ThreadEx1_1 t2 = new ThreadEx1_1(); // 생성
 
t1.start(); // 쓰레드 실행
t2.start(); // 쓰레드 실행
  • 쓰레드를 start( ) 하면 실행 가능한 상태가 되는 것이지 언제 실행될지는 모른다.
    • 이는 실행 코드를 먼저 쓴 t1이 t2보다 늦게 실행될 수도 있고 먼저 실행될 수도 있다는 의미다.
  • 쓰레드의 실행은 OS의 스케줄러가 관리해주기 때문에 이런 일이 일어나는 것이다.
    • 쓰레드는 OS 스케줄러에 의존적이다.

 

 

[start( )와 run( )]

[start( ) 호출]

  • 작성은 run( )으로 했지만 실제 호출은 start( )로 하는 이유는?

  • 각각의 쓰레드가 자신만의 별도의 호출 스택을 가지고 있기 때문에 서로 독립적인 작업을 수행하는 것이다.

 

[run( ) 호출]

  • 하나의 호출 스택을 하나의 쓰레드가 실행하는 것이 되기 때문에 start( )로 호출 해주어야 새로운 호출 스택이 생성되어 각 각의 호출 스택을 가질 수 있게 된다.