Java

[동시성 톺아보기] Runnable 익명 클래스로 Thread 생성

Lea Hwang 2024. 3. 17. 13:14

동시성 톺아보기 시리즈 작성 목적

여러 Thread가 공유 메모리에 동시에 접근할 때 동기화 문제가 발생할 수 있습니다. 이를 깊이 이해하기 위해서, 가장 먼저 Thread  생성 코드를 작성 후 내부 메커니즘을 살펴볼 것입니다.

 

timegate-commerce 선착순 상품 구매 프로젝트를 진행하면서 경험한 동시성 문제를 단순히 해결하는 것을 넘어, 운영체제의 프로세스와 스레드의 기초부터 시작해 동시성 문제를 해결해나가는 깊이있는 학습을 목표로 합니다.

 

이론

1. 스레드 생성

Thread는 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현함으로써 생성할 수 있습니다. 이 때, 익명 클래스나 람다 표현식을 활용하는 것도 가능합니다.

 

2. 스레드 실행

start() 메서드를 호출하면, 시스템 콜을 통해 커널에 스레드 생성을 요청하고, 이후 run() 메서드가 자동으로 호출됩니다.

 

3. 자바 스레드

자바에서 생성된 스레드는 시스템 콜을 통해 커널에서 생성된 Kernel Thread와 1:1로 매핑되며, 관리 주체는 JVM이 아닌 커널입니다.

 

코드 확인

Thread 생성

Runnable 익명 클래스를 사용하여 스레드를 생성합니다.

public class RunnableThread {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " : Thread 실행");
            }
        });

        thread.start();
    }
}

 

디버깅

Thread 클래스 내부로 들어가서 필요한 코드 부분에 브레이크포인트를 설정합니다.

package java.lang;

public class Thread implements Runnable {
	...
     public Thread(Runnable target) {
        this(null, target, "Thread-" + nextThreadNum(), 0);
    }
   	 ...
     @Override
     public void run() {
        if (target != null) {
            target.run();
        }
    }
	...
}

 

초기에는 메인 Thread만 존재합니다. 

 

native가 붙은 start0() 메서드는 커널 영역에서 실행(호출)됩니다.

 

그 후 run() 메서드가 자동으로 호출되며 Thread 생성이 이루어진 것을 확인할 수 있습니다.

 

콘솔 확인

 

 

배운 점

스레드를 생성하는 다양한 방법

어느 시점에 Thread가 생성되는지 과정 확인