Java/Concurrency

Java > Concurrency > 3. Thread info

Krevis 2024. 9. 5. 15:53

쓰레드는 다음과 같은 속성을 가진다

  • id
  • name
  • state
  • priority
  • threadGroup

 

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadInfoTest.java

 

 

Thread priority

쓰레드는 우선순위를 가지며, 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다

 

작업의 중요도에 따라 쓰레드 우선순위를 다르게 설정하여 특정 쓰레드가 더 많은 작업시간을 갖도록 할 수 있다

 

예를 들어 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 전송 쓰레드의 우선순위가 높아야 채팅이 원활할 것이다(대신 다운로드는 더 오래 걸릴 것이다). 이처럼 UI 관련 쓰레드는 다른 쓰레드보다 우선 순위가 높아야 한다

 

우선 순위의 범위는 1~10이며 숫자가 높을수록 우선순위가 높다. 쓰레드의 기본 우선순위값은 5이다. Thread 클래스에 상수로 정의되어 있다(Thread.NORM_PRIORITY)

 

하지만 결론적으로 멀티 코어에서는 우선순위에 따른 차이가 없다

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadPriorityTest.java

 

쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어 PriorityQueue에 저장해 두고 우선순위가 높은 작업이 먼저 처리되도록 하는 것이 나을 것이다

 

 

Thread group

서로 관련된 쓰레드를 그룹으로 다루기 위한 것

  • 일괄 종료
  • 우선 순위 설정
  • ..

 

쓰레드 그룹에 다른 그룹을 포함시킬 수 있다

 

보안상의 이유로 도입되었으며, 자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 다른 쓰레드 그룹의 쓰레드는 변경할 수 없다

 

쓰레드 그룹을 설정하는 생성자를 사용하지 않은 쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 그룹에 속한다

 

자바 애플리케이션이 실행되면, JVM은 main과 system이라는 쓰레드 그룹을 만들고 JVM 운영에 필요한 쓰레드들을 생성해 이 그룹에 포함시킨다

 

우리가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 그룹이 된다

 

https://github.com/venzersiz/learn-java8/blob/master/src/test/java/concurrency/basic/ThreadGroupTest.java

 

 

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()