본문 바로가기

자바

[JAVA] 멀티스레드란?

728x90

스레드란?

스레드(Thread)는 하나의 프로세스 내에서 실행되는 작업의 흐름이다.

자바 프로그램은 기본적으로 main() 메서드 안에서 실행되는 단일 스레드 환경이다.

하지만, 동시에 여러 작업을 처리해야 하는 경우가 있는데 이를 위해 동시에 여러 작업을 처리하는 여러 스레드를 만드는것을 멀티 스레드라 한다.

단일스레드와 멀티스레드의 차이점

구분 단일 스레드 (Single Thread) 멀티 스레드 (Multi Thread)
실행 흐름 하나의 작업만 순차적으로 수행 여러 작업을 동시에 수행
예시 한 번에 한 작업: 다운로드 → UI 갱신 동시에 진행: 다운로드 + UI 응답
장점 코드가 단순하고 예측 가능 CPU 자원을 효율적으로 사용
단점 느린 응답, 병렬 처리 불가 동기화 문제, 코드 복잡도 증가

멀티스레드를 왜 사용할까?

위에 설명했듯이 하나의 프로그램에서 여러 작업을 동시에 처리하고 싶을 때 사용하는게 바로 멀티스레드다.

물론, 멀티 프로세스비동기 프로그래밍과 같은 방법도 있으나, 본문에서는 멀티스레드를 다루고 있기 때문에 해당 내용들은 추후에 다루겠다.

멀티스레드를 사용하면 아래와 같은 장점이 있다.

  • CPU 활용률 극대화 (멀티코어 환경에서 성능 향상)
  • 반응성 향상 (UI 멈춤 방지 등)
  • 자원 공유 (하나의 메모리 공간을 여러 스레드가 함께 사용)

멀티스레드의 대표적인 예시가 바로 가비지 컬렉터(Garbage Collector)가 있다.

GC(Garbage Collector)는 애플리케이션의 메인 스레드와 별도의 스레드로 동작해 더 이상 사용하지 않는 메모리 영역을 회수하는 작업을 수행한다.

멀티스레드는 위에 설명했듯이 자원 공유 즉,하나의 메모리 공간을 GC와 애플리케이션이 같이 사용하기 때문에 애플리케이션에서 동작하는 데이터를 쉽게 공유하고 접근이 가능하다.

스레드 예시 코드

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("스레드 실행: " + getName());
    }

    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();  // 새로운 스레드에서 run() 실행
        System.out.println("메인 메서드 종료");
    }
}

start()를 호출하면 별도의 스레드가 생성되어 run()이 비동기적으로 실행된다.

만약 run()을 직접 호출하면 동기적 실행(단일 스레드)이 된다.

멀티스레드 주의점

멀티스레드를 사용하면 여러 스레드가 하나의 자원을 공유하여 사용하게 된다.

여기서, 동시에 여러 스레드가 공유하는 자원에 접근한다면 데이터가 꼬이게 되니 주의해야 한다.

반드시 하나의 스레드가 공유받는 하나의 자원만을 사용해야 하며, 스레드가 휴식하거나 종료되어야만 다른 스레드가 공유자원에 접근 가능하다.

또한, 스레드의 실행 순서는 예측이 불가능하다.

OS 스케줄러에 의해 스레드 실행 순서가 정해지기 때문에, 랜덤성을 가진다.

728x90