JAVA

Thread(쓰레드)

잔망루피 2023. 4. 24. 18:48

Thread

  • 프로세스(실행 중인 프로그램)의 자원을 이용해서 작업을 수행하는 것
  • 모든 프로세스에는 최소한 하나 이상의 쓰레드가 존재
  • 프로세스의 메모리 한계에 따라 쓰레드의 수가 결정된다.
  • 구현 방법
    1. Thread클래스를 상속받기
      • ⚠️ 다른 클래스를 상속받을 수 없다.
    2. [일반적인 방법] Runnable인터페이스를 구현하기
      • Runnable인터페이스를 구현한 클래스의 인스턴스를 생성한 다음, 이 인스턴스를 Thread클래스의 생성자의 매개변수로 제공해야 함
  • 실행 방법
    • start()를 호출한다.
      • 실행대기중인 쓰레드가 하나도 없으면 곧바로 실행상태가 된다.
      • 하나의 쓰레드에 대해 start()는 한 번만 호출될 수 있다.
        • ⚠️ 하나의 쓰레드에 대해 두 번 이상 호출하면 IllegalThreadStateException이 발생
  • 우선순위
    • 쓰레드가 얻는 실행시간이 달라지게 된다.
    • 특정 쓰레드가 더 많은 작업시간을 갖도록 설정할 수 있다.
    • 우선순위의 범위는 1 ~ 10인데 숫자가 높을수록 우선순위도 높다.
    • 쓰레드를 생성한 쓰레드로부터 우선순위를 상속받는다.
    • ⚠️ 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있다.
  • 쓰레드 그룹
    • 서로 관련된 쓰레드를 그룹으로 다루기 위한 것
    • 쓰레드 그룹 안에 다른 쓰레드 그룹을 넣을 수 있다.
  • daemon thread(데몬 쓰레드)
    • 데몬 쓰레드가 아닌 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행
    • 일반 쓰레드가 모두 종료된다면 데몬 쓰레드도 종료된다.
    • 데몬 쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.
    • ex) 가비지 컬렉터
  • 쓰레드의 동기화
    • 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 하는 것
    • 동기화 방법
      1. synchronized 이용
        1. 메서드 전체를 임계 영역으로 지정
          • 메서드 앞에 synchronized를 붙인다.
        2. 특정한 영역을 임계 영역으로 지정
          • 메서드 내의 코드 일부를 {}으로 감싸고 {} 앞에 synchronized를 붙인다.
          • {} 안으로 들어가면서부터 쓰레드는 지정된 객체의 lock을 얻는다.
            • {}을 벗어나면 lock을 반납

 

멀티쓰레딩

  • 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행
  • 두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우 멀티 쓰레드 프로세스가 더 효율적
  • 장점
    • CPU의 사용률 향상
    • 효율적인 자원 사용
    • 분리된 작업으로 코드가 간결해짐
  • 단점
    • synchronization(동기화)
      • 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 됨
      • 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요 ➡️ 임계 영역(critical section), 잠금(lock)
    • deadlock(교착상태)

 

 


참고 👇

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