
[9주차 수강 후기]
백엔드 개발을 위한 자바 프로그래밍
[KB IT's Your Life 7기] Java 멀티 스레드 완전 정복하기 🧵
안녕하세요! KB IT's Your Life 7기 기자단입니다 😊
오늘은 Java에서 정말 중요한 개념 중 하나인 멀티 스레드(Multi Thread) 에 대해 정리해볼게요.
처음엔 좀 어렵게 느껴질 수 있지만, 차근차근 따라오시면 분명히 이해되실 거예요!
1. 멀티 스레드란?
먼저 기본 개념부터 짚고 갈게요.
우리가 프로그램을 실행하면 운영체제는 그 프로그램을 프로세스(Process) 단위로 관리해요.
그리고 그 프로세스 안에서 코드가 실행되는 흐름 하나하나를 스레드(Thread) 라고 부릅니다.
그렇다면 멀티 스레드는? 두 개 이상의 코드 실행 흐름을 동시에 처리하는 것이에요!

💡 멀티 프로세스 = 프로그램 단위의 멀티 태스킹
멀티 스레드 = 프로그램 내부에서의 멀티 태스킹
2. 메인 스레드 (Main Thread)

Java 프로그램은 실행되면 가장 먼저 메인 스레드 가 시작돼요.
메인 스레드는 main() 메소드의 첫 코드부터 순차적으로 실행되고, 마지막 코드를 실행하거나 return 문을 만나면 종료됩니다.
여기서 재미있는 점이 하나 있는데요!
메인 스레드가 먼저 종료되더라도, 작업 스레드가 아직 실행 중이라면 프로세스는 종료되지 않아요.
즉, 모든 스레드가 끝나야 비로소 프로그램이 끝나는 거랍니다.
3. 작업 스레드 생성과 실행
그럼 실제 코드로 어떻게 작업 스레드를 만드는지 살펴볼까요?
방법은 크게 두 가지예요.
방법 1. Thread 클래스로 직접 생성 (Runnable 이용)
Runnable 인터페이스를 구현한 객체를 만들어서 Thread 생성자에 넘겨주는 방식이에요.
// Runnable 구현 클래스 작성
class Task implements Runnable {
@Override
public void run() {
// 스레드가 실행할 코드
}
}
// Thread 생성 및 실행
Runnable task = new Task();
Thread thread = new Thread(task);
thread.start();
익명 객체를 바로 넘겨줄 수도 있어요!
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 스레드가 실행할 코드
}
});
thread.start();
방법 2. Thread 자식 클래스로 생성
Thread 클래스를 상속받아 run() 메소드를 재정의하는 방법도 있어요.
public class WorkerThread extends Thread {
@Override
public void run() {
// 스레드가 실행할 코드
}
}
Thread thread = new WorkerThread();
thread.start();
두 방법 모두 start()를 호출해야 스레드가 실제로 실행된다는 점!
잊지 마세요 ㅎㅎㅎㅎ

4. 스레드 상태 (Thread State)
스레드는 생성되고 나서 여러 상태를 거쳐요.
크게 세 가지로 나눌 수 있어요.
실행 대기 상태 (RUNNABLE)
→ start()를 호출하면 실행을 기다리는 상태가 됩니다.
실행 상태
→ CPU 스케줄링에 따라 CPU를 점유하고 run() 메소드를 실행하는 상태예요.
스케줄링에 의해 실행 대기 상태와 실행 상태를 왔다 갔다 반복하게 됩니다.
종료 상태 (TERMINATED)
→ run() 메소드가 끝나면 스레드도 종료돼요.
그 사이에 일시 정지 상태 도 있어요.
스레드가 잠깐 멈춰야 할 때 사용하는 상태인데,
이때 자주 쓰이는 메소드들이 있어요!
메소드 설명
| sleep(long millis) | 지정한 시간만큼 일시 정지, 이후 자동으로 실행 대기 상태로 복귀 |
| join() | 다른 스레드가 종료될 때까지 기다림 |
| wait() | 동기화 블록 내에서 일시 정지 |
| interrupt() | 일시 정지 상태인 스레드에 InterruptedException 발생 |
| yield() | 실행 상태에서 다른 스레드에게 실행을 양보 |

5. 스레드 동기화 (Synchronization)
멀티 스레드 환경에서 가장 주의해야 할 것이 바로 동기화 문제 예요.
여러 스레드가 동시에 같은 객체의 데이터를 변경하려고 하면, 엉뚱한 결과가 나올 수 있거든요.
이를 방지하기 위해 synchronized 키워드를 사용합니다!
스레드 작업이 끝날 때까지 객체에 잠금을 걸어, 다른 스레드가 중간에 끼어들 수 없도록 막는 거예요.
// 동기화 메소드
public synchronized void method() {
// 단 하나의 스레드만 실행 가능한 영역
}
// 동기화 블록
public void method() {
synchronized(공유객체) {
// 단 하나의 스레드만 실행 가능한 영역
}
}
또한 두 스레드가 번갈아가며 작업할 때는 wait()과 notify()를 활용해요.
한 스레드가 작업을 마치면 notify()로 대기 중인 스레드를 깨우고, wait()으로 자신은 일시 정지 상태가 되는 방식이에요.

6. 스레드풀 (Thread Pool)
마지막으로 스레드풀 에 대해 알아볼게요!
작업이 폭발적으로 늘어날 때마다 스레드를 새로 만들면 성능이 급격히 떨어질 수 있어요.
이 문제를 해결해주는 게 바로 스레드풀이에요.
스레드풀은 미리 정해진 수의 스레드를 만들어두고, 들어오는 작업을 큐에 쌓아서 스레드들이 하나씩 꺼내 처리하는 방식이에요.
작업량이 늘어도 스레드 수가 일정하게 유지되니까 안정적으로 운영할 수 있죠!
Java에서는 java.util.concurrent 패키지의 ExecutorService와 Executors 클래스를 통해 간편하게 만들 수 있어요.
// 방법 1. 캐시 스레드풀 (필요에 따라 스레드 생성)
ExecutorService executorService = Executors.newCachedThreadPool();
// 방법 2. 고정 스레드풀 (5개 고정)
ExecutorService executorService = Executors.newFixedThreadPool(5);
사용이 끝나면 반드시 종료해줘야 해요!
executorService.shutdown(); // 현재 작업 처리 후 종료
executorService.shutdownNow(); // 즉시 중단

마무리 🎯
오늘은 Java 멀티 스레드의 핵심 개념들을 정리해봤어요!
멀티 스레드 = 하나의 프로그램 안에서 여러 작업을 동시에 처리하는 것
스레드 생성 = Thread 클래스 직접 생성 또는 자식 클래스로 생성
스레드 상태 = 실행 대기 → 실행 → 일시 정지 → 종료 사이를 순환
동기화 = synchronized로 공유 데이터를 안전하게 보호
스레드풀 = 스레드 수를 고정해 안정적인 성능 유지
처음엔 개념이 복잡하게 느껴질 수 있지만, 직접 코드를 작성하면서 연습하다 보면 점점 익숙해질 거예요!
다음 포스팅에서도 유익한 내용으로 돌아올게요 😊

#멀티캠퍼스부트캠프후기 #멀티캠퍼스부트캠프 #KBITSYOURLIFE #KB국민은행부트캠프 #KB부트캠프 #KBIT교육
'EDUCATION > [KB] IT's Your Life' 카테고리의 다른 글
| [KB IT's Your Life 7기] 11주차 후기, 코딩 테스트 자료 구조 (0) | 2026.05.18 |
|---|---|
| [KB IT's Your Life] 10주차 후기, 람다 (0) | 2026.05.11 |
| [KB IT's Your Life 7기] 8주차 후기,Java - 중첩 선언과 익명 객체 (0) | 2026.04.28 |
| [KB IT's Your Life 7기] 7주차 후기, 스켈레톤 프로젝트(가계부 앱) 후기 (7) | 2026.04.20 |
| [KB IT's Your Life 7기] 6주차 교육 후기, pinia & axios (1) | 2026.04.13 |