본문 바로가기

Java/기초

[Java] 쓰레드(Thread) - 1/2 (프로세스, 쓰레드, 데몬쓰레드)

  • 프로세스(process)
    • 실행 중인 프로그램
    • 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.
    • 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어 있다.
    • 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다.
  • 멀티 쓰레딩의 장단점
    • 장점
      • CPU의 사용률을 향상시킨다.
      • 자원을 보다 효율적으로 사용할 수 있다.
      • 사용자에 대한 응답성이 향상된다.
      • 작업이 분리되어 코드가 간결해진다.
    • 단점
      • 동기화(synchronization), 교착상태(deadlock)와 같은 문제들이 발생할 수 있다.
  • 구현방법 2가지
    • Thread 클래스 상속
    • Runnable 인터페이스 구현
    • Runnable 인터페이스를 구현하는 방법이 더 좋다.
      • 재사용성(reusability) 높음
      • 일관성(consistency) 유지
  • start(), run()
    • 쓰레드를 실행시킬 때 run()이 아닌 start()를 호출한다.
    • run()을 호출하는 것은 생성된 쓰레드를 실행시키는 것이 아니라 단순히 클래스에 선언된 메서드를 호출하는 것이다.
    • start()는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(call stack)을 생성한 다음에 run()을 호출해서, 생성된 호출스택에 run()이 첫 번째로 올라가게 한다.
    • 쓰레드는 독립적인 작업을 수행하기 위해서 새로운 쓰레드를 생성하고 종료되면 작업에 사용된 호출스택은 소멸된다.
  • main쓰레드
    • main메서드의 작업도 쓰레드이다.
    • 실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다.

컨텍스트 스위칭(context switching) : 프로세스 또는 쓰레드 간의 전환

  • 싱글쓰레드
    • 두 개의 작업을 하나의 쓰레드로 처리
  • 멀티 쓰레드
    • 두 개의 작업을 두 개의 쓰레드로 처리
  • 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다
  • CPU 이외의 자원을 사용하는 작업의 경우에는 싱글쓰레드 프로세스보다 멀쓰레드 프로세스가 더 효율적이다.
    • ex. 유저로 부터 데이터 입력, 네트워크 파일 작업

자바가 OS(플랫폼) 독립적이라고 하지만 실제로는 OS종속적인 부분이 몇가지 있다. 쓰레드도 그 중의 하나이다. 쓰레드에 우선순위에 차등을 두어 쓰레드를 실행하려면, 특정 OS의 스케쥴링 정책과 JVM의 구현을 직접 확인해봐야한다. 

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

 

  • 데몬 쓰레드(daemon thread)
    • 일반 쓰레드(데몬 쓰레드가 아닌 쓰레드)의 작업을 돕는 보조적인 역할을 수행하는 쓰레드이다.
      • 보조적인 역할을 수행하기 때문에 일반 쓰레드가 종료되면 데몬 쓰레드도 강제로 종료된다.
    • ex. 가비지 컬렉터, 자동저장, 화면갱신

'Java > 기초' 카테고리의 다른 글

[Java] 쓰레드(Thread) - 2/2 (동기화)  (0) 2021.08.09
[Java] JVM메모리 구조  (0) 2021.08.08
[Java] 애너테이션(Annotation)  (0) 2021.08.08
[Java] 지네릭스(Generics)  (0) 2021.08.08
[Java] 인터페이스 vs 추상클래스  (0) 2021.02.07