https://youtu.be/P1zDndoy4pI?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.
[쓰레드의 구현과 실행]
- Thread 클래스를 상속
- 자바는 단일 상속만 허용하기에 인터페이스로 구현하는 것이 낫다.
- 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( )로 호출 해주어야 새로운 호출 스택이 생성되어 각 각의 호출 스택을 가질 수 있게 된다.
'Java > 객체지향' 카테고리의 다른 글
[객체지향][쓰레드/thread] - 쓰레드의 우선순위, 쓰레드 그룹 (0) | 2022.03.01 |
---|---|
[객체지향][쓰레드/thread] - 싱글 쓰레드와 멀티 쓰레드, 쓰레드의 I/O 블락킹 (0) | 2022.02.28 |
[객체지향][쓰레드/thread] - 쓰레드 (0) | 2022.02.26 |
[객체지향][애너테이션/Annotation] - 애너테이션 타입 정의하기, 애너테이션의 요소 (0) | 2022.02.25 |
[객체지향][애너테이션/Annotation] - 메타 애너테이션(Meta Annotation) (0) | 2022.02.25 |