Java 멀티스레딩/동시성
Source: Dev.to
Java에서 멀티스레딩이란?
Java의 멀티스레딩은 스레드라고 불리는 프로그램의 두 개 이상 부분을 동시에 실행하도록 허용하는 기능으로, CPU 활용도를 극대화합니다. 각 스레드는 다른 스레드와 병렬로 실행될 수 있으며, 동일한 메모리 공간을 공유합니다.
핵심 개념
- Thread – 가벼운 서브‑프로세스로, 처리의 가장 작은 단위입니다. 하나의 프로세스 안에 여러 스레드가 존재할 수 있습니다.
- Concurrency vs. Parallelism
- Concurrency – 여러 스레드가 단일 CPU 코어에서 교차적으로 진행됩니다. 시스템이 스레드 간 전환을 수행해 동시에 실행되는 듯한 착각을 줍니다.
- Parallelism – 여러 스레드가 서로 다른 CPU 코어에서 동시에 실행되어 진정한 병렬 처리를 달성합니다.
- 주된 목적
- Performance – CPU 집약적인 작업을 병렬로 실행해 멀티코어 프로세서에서 실행 속도를 높입니다.
- Responsiveness – 애플리케이션을 반응형으로 유지합니다. 네트워크 요청이나 파일 다운로드와 같은 장시간 실행 작업을 백그라운드 스레드에서 수행해 UI가 멈추는 것을 방지합니다.
Java에서 스레드 생성 방법
스레드를 만드는 방법은 크게 두 가지가 있습니다.
Runnable 인터페이스 구현 (권장)
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread is running by implementing Runnable.");
}
}
// To start the thread:
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
Thread 클래스 상속
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread is running by extending Thread.");
}
}
// To start the thread:
MyThread thread = new MyThread();
thread.start();
스레드 상태
Java에서는 java.lang.Thread.State에 정의된 다음 상태 중 하나에 스레드가 존재합니다.
-
NEW – 스레드가 생성되었지만 아직 시작되지 않은 상태.
-
RUNNABLE – 스레드가 JVM 내에서 실행 중(현재 실행 중이거나 스케줄러 선택을 기다리는 준비 상태)인 상태.
-
BLOCKED – 스레드가 synchronized 블록이나 메서드에 진입하기 위해 모니터 락을 획득하려고 대기하는 상태.
-
WAITING – 스레드가 다른 스레드가 특정 동작을 수행하기를 무기한으로 기다리는 상태. 다음 메서드를 호출함으로써 이 상태에 들어갑니다:
Object.wait(); // no timeout Thread.join(); // no timeout LockSupport.park(); -
TIMED_WAITING – 스레드가 지정된 시간 동안 대기하는 상태. 타임아웃이 있는 메서드를 호출함으로써 이 상태에 들어갑니다, 예를 들어:
Thread.sleep(long millis); Object.wait(long timeout); Thread.join(long millis); LockSupport.parkNanos(long nanos); LockSupport.parkUntil(long deadline); -
TERMINATED – 스레드가
run()메서드를 정상적으로 마치거나 처리되지 않은 예외를 발생시켜 실행을 종료한 상태.