TIL #7 스레드

HYEON JIN CHOI·2024년 4월 29일

1. 프로세스와 스레드

우리가 컴퓨터를 사용하다보면 여러 프로그램들을 사용하게 된다. 크롬 브라우저, 달력, 계산기 등
우리가 실행시켜서 돌아가고 있는 이런 프로그램들을 프로세스(Process) 라고 한다.
프로세스 는 운영체제로부터 Code, Data, Stack, Heap 등을 할당 받아 프로그램을 실행시킨다.

스레드(Thread) 는 이런 프로세스 내에서 실행되는 여러 실행 경로 중 하나이다.
스레드 또한 프로세스 로부터 자원을 할당받아 실행되는데,
프로세스 내 여러 스레드 가 존재하고 각 스레드 는 자신만의 개별 Stack을 가지고 있지만
Heap 영역에 할당된 데이터는 프로세스 내 모든 스레드 와 공유한다.

Java 의 경우에는 프로그램이 JVM 프로세스 상에서 실행된다.
JVMMain 스레드 를 동작시키는데, 이는 기본적으로 처음에 실행되는 스레드 이다.

2. 스레드 동작 방식

2.1. 스레드 생성과 실행

스레드 를 생성하고 실행하는 방법에는 여러 가지가 존재하는데, Java 에서는 주로 두 가지 방법을 사용한다.
Thread 클래스를 직접 상속받는 방법과 Runnable 인터페이스를 구현하는 방법이다.

  • Thread 클래스 상속

    Thread 클래스의 run() 메서드를 오버라이딩하여 실행할 코드를 정의한다.
public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
		thread.start();		// 스레드 실행
    }
}

class MyThread extends Thread {
	@Override
    public void run() {
        System.out.println("스레드");
    }
}
  • Runnable 인터페이스 구현

    마찬가지로 run() 메서드를 오버라이딩하여 실행할 코드를 정의한다.
    이 방법은 인터페이스를 사용하는 방법이기 때문에 추가로 다른 클래스를 상속받아야 할 때 유용하다.
public class Main {
    public static void main(String[] args) {
        Runnable run = new MyRunnable();
        Thread thread = new Thread(run);	// 'Thread' 객체를 생성할 때 'Runnable' 객체 전달
		thread.start();						// 스레드 실행
    }
}

class MyRunnable implements Runnable {
	@Override
    public void run() {
        System.out.println("스레드");
    }
}
  • 람다식 사용

    Java 8 이상에서는 람다식을 사용하여 Runnable 인터페이스를 간결히 구현할 수 있다.
public class Main {
	public static void main(String[] args) {
    	Runnable run = () -> {				// 'run()' 메서드 구현
        	System.out.println("스레드");
        }
        
        Thread thread = new Thread(run);	// 'Thread' 객체를 생성할 때 'Runnable' 객체 전달
		thread.start();						// 스레드 실행
    }
}

2.2. 스레드 상태와 제어

스레드의 상태스레드 의 생명주기를 관리하고 스레드 가 어떤 작업을 수행하고 있는지 알려준다.
일반적으로 객체가 생성된 이후에는 실행대기를 반복하며 run() 메서드를 수행한다.

[그림 1. 스레드의 실행 상태]


경우에 따라 스레드실행 대기가 아닌 일시 정지 상태로 넘어갈 수도 있다.
실행 대기스레드 가 실행될 준비는 완료되었지만 CPU 자원의 할당을 기다리는 상태이고,
일시 정지스레드 가 외부 조건을 기다리며 활동이 완전히 중단된 상태이다.

[그림 2. 스레드의 실행 및 일시정지 상태]


스레드 상태에 따른 Enum은 아래와 같다.

상태Enum설명
객체 생성NEW스레드 객체가 생성되었지만 아직 start()가 호출되지 않은 상태
실행 대기RUNNABLE스레드가 실행 가능한 상태
일시 정지WAITING스레드가 특정 조건의 신호를 기다리는 상태
일시 정지TIMED_WAITING스레드가 지정된 시간동안 기다리는 상태
일시 정지BLOCKED스레드가 사용하고자 하는 객체의 Lock이 풀릴 때까지 기다리는 상태
종료TERMINATED스레드의 작업이 완료된 상태

3. 회고

스레드 개념을 깊게 파고 들면 어려울 수 있지만, 자바와 같이 멀티스레드를 지원하는 언어에서는
이 개념을 이해하고 잘 활용하여 프로그램의 성능을 향상시키는 것이 중요하기에 반드시 숙지해야할 개념이라고 생각한다.

0개의 댓글