[Java] Multi Thread

2025. 4. 29. 12:55Java

Multi Thread



프로세스 : 운영체제는 실행 중인 프로그램을 관리
스레드 : 코드의 실행 흐름

 

멀티 스레드 : 두 개의 코드 실행 흐름. 두 가지 이상의 작업을 처리, 프로그램 내부의 멀티 태스킹

멀티 프로세스 : 프로그램 단위의 멀티 태스킹

 

메인 스레드

img

  • main() 메소드의 첫 코드부터 순차적으로 실행
  • 추가 작업 스레드를 만들어서 실행시킬 수 있으나, 작업 스레드가 계속 실행 중이라면 프로세스는 종료되지 않음
Thread thread = new Thread(Runnable target);
class Task implements Runnable {
    @Override
    public void run() {
    // 스레드가 실행할 코드
    }
}
  • Thread 클래스를 상속한 다음 run() 메소드를 재정의 해서 자식 클래스를 생성할 수 있음
    • Thread 익명 자식 객체를 사용 가능
class WorkerThread extends Thread {
    public void run() {

    }
}

스레드 상태

img

  • 실행 대기 상태
  • 실행 상태
    • CPU 스케쥴링에 따라 CPU를 점유하고 run() 메소드를 실행
    • 스케쥴링에 의해 다시 실행 대기 상태로 돌아갔다가 다른 스레드가 실행 상태 반복
  • 종료 상태
    • 실행할 코드 없이 스레드의 실행을 멈춘 상태
  • 일시정지 상태
    • 스레드가 실행할 수 없는 상태
    • 스레드가 다시 실행상태로 돌아가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야함
    • Thread 클래스의 sleep() 메소드

 

어떻게 다른 스레드의 작업 종료를 인지할 수 있는가?

  • join() 메서드 : 해당 스레드가 종료할 때까지 대기하다가 스레드가 종료하면 실행을 재개

다른 스레드에게 실행 양보

  • yield() 메서드 : 실행되는 스레드는 실행 대기 상태로 돌아가고, 다른 스레드가 실행되도록 양보
  • 무의미한 반복을 막아 프로그램 성능 향상

스레드 동기화

img

  • 동기화 메소드, 블록 : 스레드 작업이 끝날 때까지 객체에 잠금을 걸어 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 함
    • 인스턴스와 정적 메소드에 synchronized 키워드
    • 메소드 실행 즉시 잠금이 일어나고, 실행이 끝나면 잠금 풀림
    • 메소드 일부 영역 실행 시 객체 잠금을 걸고 싶다면 동기화 블록을 만듦
public synchronized void method() {
    // 단 하나의 스레드만 실행하는 영역
}

스레드 제어

  • 두 스레드 교대 실행 시 공유 객체는 두 스레드가 작업할 내용을 각각 동기화 메소드로 정함
  • wait()notify() : 한 스레드 작업 완료시 notify()로 일시 정지 상태에 있는 다른 스레드를 실행 대기 상태로 만들고, wait()로 자신은 일시 정지 상태로 만듦

 

스레드를 안전하게 종료하려면

  • 사용하던 리소스(파일, 네트워크 연결)를 정리하고, run() 메소드를 빨리 종료해야함
  • 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외 발생, 예외 처리로 메소드를 정상 종료

 

데몬 스레드

  • 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
  • 예시 : 워드 프로세서의 자동 저장, 미디어 플레이어의 동영상 및 음악 재생, 가비지 컬렉터
  • 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출
public static void main(String[] args) {
    AutoSaveThread thread = new AutoSaveThread();
    thread.setDaemon(true);
    thread.start();
    ...

 

스레드풀

  • 작업 처리에 사용되는 스레드 개수를 제한하고, 작업 큐에 들어오는 작업들을 스레드가 하나씩 맡아 처리하는 방식
  • 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리
  • 작업량이 증가해도 스레드의 개수가 늘어나지 않아 성능의 급격한 저하 방지

참고자료

'Java' 카테고리의 다른 글

[Java] 람다식  (1) 2025.05.07
[Java] 컬렉션 자료구조  (1) 2025.04.30
[Java] 제네릭  (0) 2025.04.29
[Java] 인터페이스  (1) 2025.04.21
[Java] 상속  (1) 2025.04.17