Thread
- 프로세스(실행 중인 프로그램)의 자원을 이용해서 작업을 수행하는 것
- 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재
- 프로세스의 메모리 한계에 따라 쓰레드의 수가 결정된다.
- 구현 방법
- Thread클래스를 상속받기
- ⚠️ 다른 클래스를 상속받을 수 없다.
- [일반적인 방법] Runnable인터페이스를 구현하기
- Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음, 이 인스턴스를 Thread클래스의 생성자의 매개변수로 제공해야 함
- Thread클래스를 상속받기
- 실행 방법
- start()를 호출한다.
- 실행대기중인 쓰레드가 하나도 없으면 곧바로 실행상태가 된다.
- 하나의 쓰레드에 대해 start()는 한 번만 호출될 수 있다.
- ⚠️ 하나의 쓰레드에 대해 두 번 이상 호출하면 IllegalThreadStateException이 발생
- start()를 호출한다.
- 우선순위
- 쓰레드가 얻는 실행시간이 달라지게 된다.
- 특정 쓰레드가 더 많은 작업시간을 갖도록 설정할 수 있다.
- 우선순위의 범위는 1 ~ 10인데 숫자가 높을수록 우선순위도 높다.
- 쓰레드를 생성한 쓰레드로부터 우선순위를 상속받는다.
- ⚠️ 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있다.
- 쓰레드 그룹
- 서로 관련된 쓰레드를 그룹으로 다루기 위한 것
- 쓰레드 그룹 안에 다른 쓰레드 그룹을 넣을 수 있다.
- daemon thread(데몬 쓰레드)
- 데몬 쓰레드가 아닌 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행
- 일반 쓰레드가 모두 종료된다면 데몬 쓰레드도 종료된다.
- 데몬 쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.
- ex) 가비지 컬렉터
- 쓰레드의 동기화
- 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 하는 것
- 동기화 방법
- synchronized 이용
- 메서드 전체를 임계 영역으로 지정
- 메서드 앞에 synchronized를 붙인다.
- 특정한 영역을 임계 영역으로 지정
- 메서드 내의 코드 일부를 {}으로 감싸고 {} 앞에 synchronized를 붙인다.
- {} 안으로 들어가면서부터 쓰레드는 지정된 객체의 lock을 얻는다.
- {}을 벗어나면 lock을 반납
- 메서드 전체를 임계 영역으로 지정
- synchronized 이용
멀티쓰레딩
- 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행
- 두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우 멀티 쓰레드 프로세스가 더 효율적
- 장점
- CPU의 사용률 향상
- 효율적인 자원 사용
- 분리된 작업으로 코드가 간결해짐
- 단점
- synchronization(동기화)
- 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 됨
- 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요 ➡️ 임계 영역(critical section), 잠금(lock)
- deadlock(교착상태)
- synchronization(동기화)
참고 👇
Java의 정석 3판
반응형
'JAVA' 카테고리의 다른 글
HttpURLConnection | RestTemplate | WebClient (0) | 2023.12.28 |
---|---|
enums(열거형) (0) | 2023.05.22 |
JVM (0) | 2023.04.23 |
Abstract class(추상 클래스) (0) | 2023.03.23 |
javax (0) | 2023.03.03 |