스레드(Thread)
✒️ 2025-05-15 10:20 내용 수정
- 멀티태스킹 : 2가지 이상의 작업을 동시에 처리하는 것
- 컴퓨터의 멀티태스킹을 위한 두 가지 도구 : 프로세스, 스레드
- 프로그램 : 파일이 존재하지만 아직 메모리에 올라가 있지 않은 상태
프로세스(Process)
프로그램을 실행하는 순간 메모리에 올려서 동작하는 것
- 프로그램에 사용되는 데이터, 메모리 등의 자원, 스레드로 구성된다.
- 하나의 프로세스는 하나의 스레드 혹은 하나의 어플리케이션일 수도 있다.
- 멀티 프로세스 : 여러 개의 cpu를 사용하여 여러 프로그램을 동시에 실행하는 것이다.
- 프로세스는 독립적으로 메모리에 등록되기 때문에 여러 개의 프로그램을 동시에 실행할 수 있다.
- 이런 환경을 멀티 태스킹 환경이라고 부른다.
- ex) 컴퓨터에서 카톡, 게임, 음악 어플 등을 동시에 실행할 수 있다.
- 프로세스의 실행 방식
- 시간 분할 방식 : 모든 프로세스에게 동일한 시간을 할당하고 골고루 실행되는 방식
- 선점형 방식 : 각각의 프로세스에게 우선순위를 부여하고 높은 순으로 실행되는 방식
스레드
프로세스 내에서 실제로 작업을 수행하는 것
- 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
- 스레드는 각자가 독립적인 개체로 존재한다.
- 멀티스레드 : 하나의 프로세스 내에 두 개 이상의 스레드가 작업을 하는 것이다.
- 각 스레드가 자신이 속한 프로레스의 메모리를 공유하기 때문에 시스템의 자원 낭비가 적다.
- ex) 카톡에서 문자 보내기, 받기, 이모티콘, 선물 기능 등의 업무를 동시에 할 수 있다.
| 담당자 | 일 |
|---|---|
| JVM | 스레드 스케쥴링, 스레드 개수 파악, 스레드의 우선순위 확인 스레드가 실행되는 프로그램 코드의 메모리 위치 확인 현재 스레드의 상태 확인 |
| 개발자 | 자바 스레드로 작동할 작업이 무엇인지 코드로 작성 스레드 코드가 작동할 수 있도록 JVM에 요청 |
구현 방법
- 스레드의
run()은 메인함수와 별개로 실행된다. 그리고 메인도 일종의 스레드이다
- Thread 클래스를 상속해서
run()메서드 구현- Thread의
run()메서드는 독립적으로 수행하지 못한다. run()을 그냥 호출해버리면 일반 메서드처럼 수행해버리므로, 반드시 Thread의start()메서드로run()을 호출해야 한다.
- Thread의
public class ThreadTest extends Thread{
@Override
public void run() {
// 작업내용
}
}
public class ThreadMain {
public static void main(String[] args) {
// Thread 클래스 상속 후 객체 생성
ThreadTest t1 = new ThreadTest();
t1.start();
}
}
- Runnable 인터페이스 구현하고, Thread 클래스로 객체 생성하기
- Runnable 인터페이스는 함수형 인터페이스이므로 람다식으로 표현할 수 있다.
- 함수형 인터페이스 참고
public class RunnableTest implements Runnable {
@Override
public void run() {
// 작업내용
}
}
public class ThreadMain {
public static void main(String[] args) {
// Runnable 인터페이스 구현 후 Thread 클래스로 객체 생성 후 사용
RunnableTest t2 = new RunnableTest();
Thread t = new Thread(t2);
t.start();
}
}
// 람다식으로 Runnable을 구현한 방법
public class Main {
public void static main(String[] args) {
Runnable rn = () -> {
// 작업할 내용
};
Thread t = new Thread(rn);
t.start();
}
}
Thread 클래스
| 메서드 | 설명 |
|---|---|
static Thread currentThread() |
현재 수행되는 스레드 객체를 반환 |
String getName() |
스레드의 이름을 반환 |
void setName(String name) |
스레드의 이름을 지정 |
int getPriority() |
스레드의 우선순위를 반환, 숫자가 작을수록 높은 우선순위 |
void setPriority(int newPriority) |
스레드의 우선순위를 지정 |
void start() |
스레드를 시작 |
State getState() |
스레드의 상태를 반환 |
| 상태변화 메서드 | 설명 |
|---|---|
static void sleep(long millis) |
millisecond에 지정된 시간만큼 대기 |
void join() |
현재 스레드는 join() 메서드를 호출한 스레드가 종료할 때까지 대기 |
static void yield() |
수행중인 스레드 중 우선순위가 같은 스레드에게 제어권을 넘김 스레드 자신에게 주어진 실행시간을 다음 차례의 스레드에게 양보하고, 자신은 실행 대기 상태가 된다. |
void wait() |
스레드를 대기시킴 |
void notify() |
대기중인 스레드를 다시 동작시킴 |
스레드의 상태(State)
- 스레드는 생성하고 실행, 종료될 때까지 다양한 상태를 가진다.
Thread.State타입으로 확인할 수 있다.
- 스레드의 효율적 사용을 위해선 스레드의 동기화와 상태를 적절하게 이용할 수 있어야 한다.

| 상태 | 상수 | 설명 |
|---|---|---|
| 생성 | NEW |
스레드 객체가 생성되었지만 아직 start()에서 호출되지 않은 상태 |
| 대기 | RUNNABLE |
실행 대기 또는 실행 상태로 언제든지 갈 수 있는 상태 |
| 일시정지 | WAITING |
다른 스레드가 종료될 때까지 대기하는 상태 |
| 일시정지 | TIMED_WAITING |
주어진 시간 동안 대기하는 상태 |
| 일시정지 | BLOCKED |
락이 풀릴 때까지 대기하는 상태 |
| 종료 | TERMINATED |
수행을 종료한 상태 |
- 스레드 생성부터 종료
- 처음 스레드가 생성되면 스레드는 NEW 상태가 된다.
- 생성 이후에 start() 메서드를 실행하면 스레드는 RUNNABLE 상태로 변한다.
- 시작 이후에 스레드가 종료되면 TERMINATED 상태가 된다.
- WAIT(일시정지)
- 필요에 의해 스레드를 잠시 멈춤 상태로 두는 것
- 일정 시간을 지정하거나, 멈충 상태의 락이 풀릴 때까지 대기하도록 만들 수 있다.
public class ThreadMethod extends Thread {
@Override
public void run() {
this.setName("Thread3");
System.out.println("현재 실행되고 있는 스레드의 이름 : " + Thread.currentThread().getName());
System.out.println("현재 실행되고 있는 스레드의 상태 : " + Thread.currentThread().getState());
System.out.println("현재 실행되고 있는 스레드의 우선순위 : " + Thread.currentThread().getPriority());
}
}
public class ThreadMain {
public static void main(String[] args) {
ThreadMethod tm = new ThreadMethod();
tm.start();
System.out.println("메인에서 현재 실행되고 있는 스레드의 이름 : " + Thread.currentThread().getName());
System.out.println("메인에서 현재 실행되고 있는 스레드의 상태 : " + Thread.currentThread().getState());
System.out.println("메인에서 현재 실행되고 있는 스레드의 우선순위 : " + Thread.currentThread().getPriority());
}
}
메인에서 현재 실행되고 있는 스레드의 이름 : main
현재 실행되고 있는 스레드의 이름 : Thread3
현재 실행되고 있는 스레드의 상태 : RUNNABLE
메인에서 현재 실행되고 있는 스레드의 상태 : RUNNABLE
현재 실행되고 있는 스레드의 우선순위 : 5
메인에서 현재 실행되고 있는 스레드의 우선순위 : 5
데몬스레드
스레드객체이름.setDaemon(true);
- 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
- 함께 구동중인 일반 스레드가 종료되면 데몬스레드도 함께 종료된다.
- 메모리 관리때문에 사용 시에 주의해야 한다.
- ex) 문서를 작성하는 도중에 3초 간격으로 자동 세이브를 실행하는 코드 작성
package ex3_thread;
public class DaemonTest {
public static void main(String[] args) {
Thread daemonThread = new Thread(new MyDaemonRunnable());
// 직접 만든 스레드를 데몬 스레드로 설정
daemonThread.setDaemon(true);
daemonThread.start();
for(int i = 1; i <= 15; i++) {
System.out.println(i);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
System.out.println("메인 스레드 종료");
}
}
class MyDaemonRunnable implements Runnable {
@Override
public void run() {
try {
for(int i = 1; i <= 15; i++) {
System.out.println("저장되었습니다.");
Thread.sleep(3000);
}
} catch (Exception e) {
}
}
}