시스템에서 실행중인 프로그램
프로세스(Process)는 일반적으로 cpu에 의해 메모리에 올려서 실행중인 프로그램을 말한다.
자신만의 메모리 공간을 포함한 독립적인 실행 환경을 가지고 있다.
각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당받는다.
자바 JVM(Java Virtual Machine)은 주로 하나의 프로세스로 실행되며,
동시에 여러 작업을 수행하기 위해 멀티 스레드를 지원하고 있다.
하나의 프로세스 안에서 독립적으로 실행되는 '작은 실행 단위'
스레드(Thread)는 프로세스 안에서 실질적으로 작업을 실행하는 단위를 말한며,
자바에서는 JVM(Java Virtual Machine)에 의해 관리된다.
프로세스에는 적어도 한 개 이상의 스레드가 있으며,
Main 스레드 하나로 시작하여 스레드를 추가 생성하게 되면 멀티 스레드 환경이 된다.
이러한 스레드들은 프로세스의 리소스를 공유하기 때문에 효율적이긴 하지만 잠재적 문제점에 노출될 수 있다.
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 정의 | 메모리에 올라와 실행되는 프로그램의 인스턴스 | 프로세스 내에서 실행되는 작업의 흐름 단위 |
| 메모리 영역 | 독립된 메모리(Code, Data, Stack, Heap)를 할당받음 | 같은 프로세스 내의 스택을 제외한 나머지 영역(Code, Data, Heap)을 공유 |
| 주소 공간 | 별도의 주소 공간에서 실행 | 같은 프로세스 내의 주소 공간을 공유 |
| 오류 발생 시 | 한 프로세스에서 오류 발생 시 다른 프로세스에 영향 없음 | 한 스레드에서 오류 발생 시 같은 프로세스 내 다른 스레드에 영향 |
하드웨어 관점에서 여러 CPU나 코어를 사용해 여러 프로세스를 병렬로 실행하는 방식

하나의 프로세스 내에서 여러 스레드를 동시에 실행하여 작업을 병렬 처리
💡단일스레드(Single-Thread)
- 하나의 프로세스 내에서 하나의 스레드만 실행되는 것(순차 실행).
프로그램이 하나의 작업만 처리할 수 있다는 의미이며, 다른 작업이 실행되기 전에 현재 작업이 완료 되어야 한다.
- 멀티 태스킹을 지원하지 않고 하나의 태스크만 처리할 수 있으므로 처리량이 낮아지는 단점이있다.
💡 멀티스레드(Multi-Thread)
- 하나의 프로세스 내에서 동시에 여러 개의 스레드가 실행되는 것(병행 실행).
스레드가 동시에 여러 작업을 처리할 수 있기 때문에 시스템의 성능을 향상할 수 있다.
- 프로그램의 작업을 분할하여 처리하기 때문에 다양한 작업을 동시에 처리하여 빠르고 효율적으로 실행할 수 있다. 그러나 스레드 간의 동기화 같은 부작용으로 이를 고려해서 프로그래밍해야 한다.




| 상태 | 설명 |
|---|---|
| NEW | Thread 객체가 생성된 상태이지만, 아직 start() 메서드가 호출되지 않은 상태이다. |
| RUNNABLE | start() 메서드가 호출된 후 CPU스케줄링에 따라 CPU를 할당받을 수 있는 실행 대기 상태이다. CPU를 할당받으면 run() 메서드를 실행할 수 있다. |
| RUNNING | Thread가 실행된 상태로, run() 메서드가 실행중인 상태이다. 이 상태에서 run() 메서드를 모두 실행하기 전에 실행 대기 상태로 다시 전환될 수 있다. 이 경우 다른 스레드가 실행된다. |
| BLOCKED | Threadrk 동기화된 자원을 사용하기 위해 대기 중인 상태이다. |
| WAITING | Thread가 다른 Thread의 작업이 끝나기를 기다리는 상태이다. 예를 들어, join() 메서드를 호출할 때 발생할 수 있다. |
| TIMED_WAITING | 특정 시간이 지나기를 기다리는 상태이다. sleep() 메서드 호출 시 발생할 수 있다. |
| TERMINATED | Thread가 작업을 완료하고 종료된 상태이다. (스레드가 번갈아 가면서 실행되다가 더 이상 실행할 코드가 없을 때) |

| 구분 | 메서드 | 설명 |
|---|---|---|
| 일시 정지로 보냄 | sleep(long millis) | 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 시간이 지나면 자동으로 실행 대기 상태가 된다. |
| join() | join() 메서드를 호출한 스레드는 일시 정지 상태가 된다. 호출한 스레드가 종료될 때까지 기다린다. | |
| wait() | 동기화 블록 내에서 스레드를 일시 정지 상태로 만든다. | |
| 일시 정지에서 벗어남 | interrupt() | 일시 정지 상태일 경우, InterruptedException을 발생시켜 실행 대기 또는 종료 상태로 만든다. |
| notify() | wait() 메서드로 일시 정지된 스레드 중 하나를 실행 대기 상태로 만든다. | |
| notifyAll() | wait() 메서드로 일시 정지된 모든 스레드를 실행 대기 상태로 만든다. | |
| 실행 대기로 보냄 | yield() | 실행 상태에서 다른 스레드에게 실행을 양보하고 실행 대기 상태가 된다. |
Thread 생성 및 시작 메서드
| 메서드 | 설명 |
|---|---|
| start() | 새로운 Thread를 시작하며, 이 메서드는 내부적으로 run() 메서드를 호출한다. |
| run() | Thread가 실행할 코드를 포함하는 메서드이며, start() 메서드에 의해 호출된다. |
Thread 상태 확인 메서드
| 메서드 | 설명 |
|---|---|
| isAlive() | Thread가 아직 실행 중인지를 확인할 수 있다. Thread가 종료되지 않았다면 true를 반환한다. |
| getState() | 현재 Thread의 상태를 반환한다. 상태는 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED로 구분된다. |
Thread 동기화
| 키워드/메서드 | 설명 |
|---|---|
| synchronized | 여러 스레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 Race Condition(경쟁 상태)를 방지하는 역할을 한다. |

동기화 문제는 여러 Thread가 동시에 동일한 자원에 접근할 때 발생하는 문제이다. 동기화되지 않은 자원에 여러 Thread가 접근하면, 데이터 불일치와 같은 문제가 발생할 수 있다.
Race Condition은 여러 스레드가 동시에 공유 자원에 접근하여 잘못된 값을 읽거나 기록할 때 발생하는 문제이다. 예를 들어, 그레드 두 개가 동시에 변수 값을 증가시키면, 두 스레드가 값이 증가되기 전의 값을 읽고 각기 다른 값을 저장하게 된다.
특정 메서드나 코드 블록에 대해 한 번에 하나의 스레드만 접근할 수 있도록 제한하는 키워드

반드시 synchronized 키워드와 함께 사용
wait() : 현재 스레드를 일시적으로 정지시키며, 다른 스레드가 notify() 나 notifyAll()을 호출할 때까지 대기한다.notify() : wait() 상태에 있는 스레드 중 하나를 깨워 대기 상태에서 벗어나도록 한다.notifyAll() : wait() 상태에 있는 모든 스레드를 깨워 작업을 재개할 수 있도록 한다.
동기화는 정확도는 올라가지만 속도는 떨어지고, 비동기화는 속도는 향상되지만 정확도가 떨어진다.
Thread 내에서 예외가 발생하면 해당 Thread는 종료되지만, 다른 Thread의 실행에는 영향을 주지 않는다.


Thread는 작업이 완료되면 자동으로 종료되지만, 강제로 종료시키려면 interrupt() 메서드를 사용하면 된다.

주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 보조 스레드이기 때문에 주 스레드가 종료되면 데몬 스레드도 자동으로 종료된다.
데몬 스레드는 백그라운드에서 실행되며, 주로 자동 저장, 미디어 재생, 가비지 컬렉션 등과 같은 작업에 사용된다.
setDemon(true) 메서드를 호출하여 해당 스레드를 데몬 스레드로 설정할 수 있다.