쓰레드는 다음과 같은 속성을 가진다
- id
- name
- state
- priority
- threadGroup
Thread priority
쓰레드는 우선순위를 가지며, 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다
작업의 중요도에 따라 쓰레드 우선순위를 다르게 설정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다
예를 들어 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 전송 쓰레드의 우선순위가 높아야 채팅이 원활할 것이다(대신 다운로드는 더 오래 걸릴 것이다). 이처럼 UI 관련 쓰레드는 다른 쓰레드보다 우선 순위가 높아야 한다
우선 순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높다. 쓰레드의 기본 우선순위값은 5이다. Thread 클래스에 상수로 정의되어 있다(Thread.NORM_PRIORITY)
하지만 결론적으로 멀티 코어에서는 우선순위에 따른 차이가 없다
쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어 PriorityQueue에 저장해 두고 우선순위가 높은 작업이 먼저 처리되도록 하는 것이 나을 것이다
Thread group
서로 관련된 쓰레드를 그룹으로 다루기 위한 것
- 일괄 종료
- 우선 순위 설정
- ..
쓰레드 그룹에 다른 그룹을 포함시킬 수 있다
보안상의 이유로 도입되었으며, 자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 다른 쓰레드 그룹의 쓰레드는 변경할 수 없다
쓰레드 그룹을 설정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 그룹에 속한다
자바 애플리케이션이 실행되면, JVM은 main과 system이라는 쓰레드 그룹을 만들고 JVM 운영에 필요한 쓰레드들을 생성해 이 그룹에 포함시킨다
우리가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 그룹이 된다
Thread state
쓰레드는 상태를 가진다
Thread 클래스에 State라는 열거형이 정의되어 있다
- NEW
- 아직 시작되지 않은 상태
- 쓰레드가 생성되고 start() 메서드가 호출되기 전
- start() 메서드를 호출하면 바로 실행되지 않고 실행 대기열에 저장되어 자기 차례를 기다린다
- 관련 메서드: 생성자
- RUNNABLE
- 실행중 상태
- 이 상태의 쓰레드는 JVM 내에서 실행중이지만, 프로세서와 같은 OS의 다른 자원을 기다리고 있을 수 있다
- 실행 가능 상태라고도 할 수 있겠다
- OS 스케줄러의 실행 대기열에 저장되어 자기 차례를 기다렸다가, 차례가 되면 실행됨
- 관련 메서드: start()
- TERMINATED
- 종료 상태
- 실행이 완료됨
- TIMED_WAITING
- 쓰레드가 지정된 시간동안 다른 쓰레드의 작업이 완료되기를 기다리는 대기 상태
- 양수 대기 시간으로 다음 메서드 중 하나를 호출하여 대기
- Thread.sleep
- 타임아웃(파라미터) 있는 Object.wait
- 타임아웃(파라미터) 있는 Thread.join
- LockSupport.parkNanos
- LockSupport.parkUntil
- 관련 메서드: sleep
- BLOCKED
- Monitor lock을 얻기를 기다리며 차단된 상태
- Lock이 풀릴 때까지 기다리는 상태
- 동기화된(synchronized) 블락/메서드에 진입하기 위해, 또는 Object.wait 호출 후에 동기화된 블락/메서드에 재진입하기 위해 차단된 상태
- 이 상태에서는 인터럽트가 되지 않음. 우리가 제어 불가
- 관련 메서드
- Object.wait()
- WAITING
- 쓰레드가 다른 쓰레드의 작업이 완료되기를 기다리는 대기 상태
- 다음 메서드 중 하나를 호출하여 대기
- 타임아웃(파라미터) 없는 Object.wait
- 타임아웃(파라미터) 없는 Thread.join
- LockSupport.park
- 객체에서 Object 클래스의 wait()를 호출한 쓰레드는 다른 쓰레드가 그 객체에서 Object.notify() 또는 Object.notifyAll()을 호출하기를 기다린다
- Thread.join()을 호출한 쓰레드는 지정된 다른 쓰레드가 종료되길 기다린다
- interrupt() 메서드가 호출되면 RUNNABLE 상태로 바뀐다
- 관련 메서드
- Thread.join()
'Java > Concurrency' 카테고리의 다른 글
| Java > Concurrency > 7. Synchronization (0) | 2024.09.23 |
|---|---|
| Java > Concurrency > 6. Memory visibility (0) | 2024.09.13 |
| Java > Concurrency > Thread scheduling (0) | 2024.09.03 |
| Java > Concurrency > 4. Thread methods (0) | 2024.08.30 |
| Java > Concurrency > 5. Daemon thread (0) | 2024.08.29 |