우리가 컴퓨터를 사용하다보면 여러 프로그램들을 사용하게 된다. 크롬 브라우저, 달력, 계산기 등
우리가 실행시켜서 돌아가고 있는 이런 프로그램들을 프로세스(Process) 라고 한다.
프로세스 는 운영체제로부터 Code, Data, Stack, Heap 등을 할당 받아 프로그램을 실행시킨다.
스레드(Thread) 는 이런 프로세스 내에서 실행되는 여러 실행 경로 중 하나이다.
스레드 또한 프로세스 로부터 자원을 할당받아 실행되는데,
프로세스 내 여러 스레드 가 존재하고 각 스레드 는 자신만의 개별 Stack을 가지고 있지만
Heap 영역에 할당된 데이터는 프로세스 내 모든 스레드 와 공유한다.
Java의 경우에는 프로그램이JVM 프로세스상에서 실행된다.
JVM은Main 스레드를 동작시키는데, 이는 기본적으로 처음에 실행되는스레드이다.
스레드 를 생성하고 실행하는 방법에는 여러 가지가 존재하는데, 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("스레드");
}
}
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(); // 스레드 실행
}
}
스레드의 상태 는 스레드 의 생명주기를 관리하고 스레드 가 어떤 작업을 수행하고 있는지 알려준다.
일반적으로 객체가 생성된 이후에는 실행과 대기를 반복하며 run() 메서드를 수행한다.
[그림 1. 스레드의 실행 상태]
스레드 는 실행 대기가 아닌 일시 정지 상태로 넘어갈 수도 있다.스레드 가 실행될 준비는 완료되었지만 CPU 자원의 할당을 기다리는 상태이고,스레드 가 외부 조건을 기다리며 활동이 완전히 중단된 상태이다.
[그림 2. 스레드의 실행 및 일시정지 상태]
스레드 상태에 따른 Enum은 아래와 같다.
| 상태 | Enum | 설명 |
|---|---|---|
| 객체 생성 | NEW | 스레드 객체가 생성되었지만 아직 start()가 호출되지 않은 상태 |
| 실행 대기 | RUNNABLE | 스레드가 실행 가능한 상태 |
| 일시 정지 | WAITING | 스레드가 특정 조건의 신호를 기다리는 상태 |
| 일시 정지 | TIMED_WAITING | 스레드가 지정된 시간동안 기다리는 상태 |
| 일시 정지 | BLOCKED | 스레드가 사용하고자 하는 객체의 Lock이 풀릴 때까지 기다리는 상태 |
| 종료 | TERMINATED | 스레드의 작업이 완료된 상태 |
스레드 개념을 깊게 파고 들면 어려울 수 있지만, 자바와 같이 멀티스레드를 지원하는 언어에서는
이 개념을 이해하고 잘 활용하여 프로그램의 성능을 향상시키는 것이 중요하기에 반드시 숙지해야할 개념이라고 생각한다.