멀티스레딩
멀티스레딩의 개념
멀티스레딩은 하나의 프로세스 내에서 여러 스레드가 동시에 실행되는 것을 의미합니다. 스레드는 프로세스의 실행 단위로, 각 스레드는 독립적으로 실행되지만 같은 메모리 공간을 공유합니다. 멀티스레딩을 통해 CPU 자원을 효율적으로 활용할 수 있으며, 프로그램의 응답성을 향상시키고, 대기 시간을 줄일 수 있습니다. 예를 들어, 사용자 인터페이스(UI) 스레드와 백그라운드 작업 스레드를 분리하여 UI가 사용자 입력에 즉시 반응할 수 있도록 할 수 있습니다.
스레드 생성 방법
자바에서 스레드를 생성하는 방법은 두 가지가 있습니다: Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하는 것입니다.
Thread 클래스 상속: Thread 클래스를 상속받아 run() 메서드를 오버라이드하여 스레드의 작업을 정의합니다. 이후 start() 메서드를 호출하여 스레드를 시작합니다.
Runnable 인터페이스 구현: Runnable 인터페이스를 구현하고 run() 메서드를 오버라이드한 후, Thread 객체에 전달하여 실행합니다. 이 방법은 다중 상속이 필요한 경우 유용합니다.
스레드 동기화
멀티스레딩 환경에서는 여러 스레드가 공유 자원에 동시에 접근할 수 있기 때문에 데이터의 일관성을 유지하기 위해 동기화가 필요합니다. 자바에서는 synchronized 키워드를 사용하여 메서드나 블록을 동기화할 수 있습니다.
메서드 동기화: synchronized 키워드를 메서드 선언에 추가하여 해당 메서드가 한 번에 하나의 스레드만 접근할 수 있도록 합니다.
블록 동기화: 특정 코드 블록만 동기화하려면 synchronized 블록을 사용합니다. 이 경우, 동기화할 객체를 지정할 수 있습니다.
스레드 상태와 생명주기
스레드는 여러 상태를 가지며, 각 상태는 스레드의 생명주기를 나타냅니다. 주요 상태는 다음과 같습니다:
생성(New): 스레드 객체가 생성되었지만 아직 실행되지 않은 상태입니다.
실행(Runnable): 스레드가 실행 중이거나 실행 대기 중인 상태입니다. CPU에 의해 스케줄링되어 실행될 수 있습니다.
대기(Blocked): 다른 스레드에 의해 자원을 기다리고 있는 상태입니다. 예를 들어, 동기화된 메서드에 접근하려고 할 때 발생합니다.
대기(Waiting): 특정 조건이 충족될 때까지 대기하는 상태입니다. Object.wait(), Thread.join(), LockSupport.park() 메서드에 의해 발생합니다.
종료(Terminated): 스레드의 작업이 완료되어 종료된 상태입니다. 이 상태에 도달하면 스레드는 더 이상 실행되지 않습니다.
스레드 풀과 Executor 프레임워크
스레드 풀은 미리 생성된 스레드의 집합으로, 필요할 때 스레드를 재사용하여 성능을 향상시키는 기법입니다. 자바에서는 Executor 프레임워크를 통해 스레드 풀을 쉽게 관리할 수 있습니다. ExecutorService 인터페이스를 사용하여 스레드 풀을 생성하고 작업을 제출할 수 있습니다.
스레드 풀 생성: Executors 클래스의 정적 메서드를 사용하여 다양한 유형의 스레드 풀을 생성할 수 있습니다.
작업 제출: submit() 메서드를 사용하여 Runnable 또는 Callable 작업을 스레드 풀에 제출합니다.
종료: 모든 작업이 완료된 후 shutdown() 메서드를 호출하여 스레드 풀을 종료합니다.