Programming/Java \ Spring

🔥자바스터디🔥 자바의 정석 CH13 쓰레드

13장. 쓰레드

 

-프로세스 & 쓰레드

 

      프로세스 : 실행 중인 프로그램

      프로세스 구성 : 필요한 데이터 & 메모리 등의 자원, 쓰레드

      쓰레드 : 실제로 작업을 수행하는 것

     

      ** 쓰레드가 둘 이상이면 멀티쓰레드 프로세스라고 한다.

      ex) 프로세스 = 공장 ,  쓰레드 = 일꾼 이라고 생각하면 이해하기 쉽다.

 

-멀티쓰레딩

장점 단점
- CPU사용률을 향상시킨다.
- 자원을 보다 효율적으로 사용 가능하다.
- 응답성이 향상된다.
- 작업 분리 -> 코드가 간결해진다.
- 자원을 공유하는 특성 존재
- 동기화(synchronization), 교착상태(deadlock) 같은 문제들을 고려하면서 프로그래밍 진행

 

-쓰레드의 구현 & 실행

 

     - Thread클래스를 상속받는다.

     - Runnable인터페이스를 구현한다.

     ** 2가지 방법 모두 상관없지만 Thread클래스를 상속받으면 다른 클래스 상속이 안되기 때문에

       보통은 Runnable인터페이스 구현을 한다.

       (Runnable인터페이스는 run()만 정의되어 있는 간단한 인터페이스이다.)

 

-start()

 

      - 쓰레드를 생성한 후 start()를 호출해야 쓰레드가 실행된다.

      - 쓰레드 작업이 한번 더 진행되어야 한다면 새로운 쓰레드를 한번 더 생성한 다음 start() 호출해야 한다.

 

-start() & run()

 

      - main메서드에서 쓰레드의 start() 호출

      - start()는 새로운 쓰레드 생성, 쓰레드가 작업하는데 사용될 호출스택 생성

      - 생성된 호출스택에 run() 호출 -> 쓰레드가 독립된 공간에서 작업 수행

      - 호출스택이 2개 -> 스케줄러가 정한 순서에 의해 진행된다.

 

-싱글쓰레드 & 멀티쓰레드

 

       - 하나의 쓰레드로 2개의 작업을 수행한 시간 : T1

       - 2개의 쓰레드로 2개의 작업을 수행한 시간 : T2

       (T1과 T2는 거의 비슷하다.)

 

       ** 멀티쓰레드가 context switching 때문에 좀 더 걸리기 때문에 단순 계산작업은 싱글쓰레드가 더 효율적이다.

 

-쓰레드의 I/O블락킹

 

       - 서로 다른 자원을 사용하는 작업의 경우 : 멀티쓰레드 프로세스가 더 효율적

          ex) 사용자로부터 입력받는 작업과 화면에 출력하는 작업이 있을 때

               멀티쓰레드는 하나의 쓰레드가 사용자의 입력을 기다리는 동안 다른 쓰레드가 작업을 처리 가능

       - 효율적인 CPU 사용 가능

 

-쓰레드의 우선순위

 

        - 쓰레드에 우선순위를 정해 실행시간이 달라질 수 있다.

        - 범위 : 1~10

           숫자가 높을수록 우선순위가 높다(10 : 최대우선순위, 1 : 최소우선순위, 5 : 보통우선순위)

        - 자바가 OS독립적인 특성을 가지고 있지만 쓰레드는 OS 종속적인 특성을 가지고 있어

           OS마다 다른 방식으로 스케쥴링하기 때문에 컴퓨터마다(OS마다) 다른 결과가 도출될수 있다.

 

-쓰레드 그룹(Thread Group)

 

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

        - 보안상의 이유로 도입된 개념

        - 그룹을 지정하지 않으면 자동으로 main쓰레드 그룹에 속하게 된다.

 

-데몬 쓰레드(daemon thread)

         

        - 일반 쓰레드의 작업을 보조하는 보조적인 역할을 수행하는 쓰레드

           ex) 가비지 컬렉터, 자동저장, 화면자동갱신 등

        - 데몬 쓰레드가 생성한 쓰레드는 자동으로 데몬 쓰레드가 된다.

        - setDaemon메서드는 반드시 start()를 호출하기 전에 실행되어야 한다.

           그렇지 않으면 IllegalThreadStateException이 발생

 

-쓰레드의 상태

상태 설명
NEW 쓰레드가 생성되고 아직 start()는 호출되지 않음
RUNNABLE 실행 중 또는 실행 가능 상태
BLOCKED 동기화블럭에 의해 일시정지된 상태
WAITING , TIMED_WAITING - 쓰레드의 작업은 종료X, 실행가능하지 않은 일시정지상태
- TIMED_WAITING은 일시정지시간이 지정된 경우
TERMINATED 쓰레드의 작업 종료

 

-쓰레드의 실행제어

 

         - 쓰레드의 실행을 제어하는 메서드 제공하여 효율적인 프로그래밍 가능하도록 도와준다.

         

          sleep() : 지정시간동안 멈춤

          interrupt() : 쓰레드의 작업을 멈추라고 요청 , 강제성은 없다.

          suspend(), resume(), stop() : 쓰레드의 실행제어를 하는 가장 손쉬운 방법

                                               하지만 교착상태를 일으키기 쉬움 -> 현재는 Deprecated됨

          join() : 다른 쓰레드의 작업을 기다림

          yield() : 다른 쓰레드에게 양보  -> yield() 와 interrupt()를 잘 사용하면 효율적인 실행 가능

 

-쓰레드의 동기화

 

       한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에게 방해받지 않도록 해야되기 때문에

        쓰레드의 동기화는 멀티쓰레드 프로세스에서 필수적으로 고려해야한다.

 

       critical section(임계 영역), lock 개념이 도입

       synchronization(동기화) : 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것

                 

       [ 쓰레드 동기화 방법] 

                     

       synchronized 키워드를 이용한다.

       메서드를 임계영역으로 지정 OR 특정 영역을 임계영역으로 지정 -> 2가지 방식 존재

       임계영역에 들어가면 lock(락)을 얻어 작업을 수행 ,  벗어나면 lock(락)을 반환.

 

 

-wait() & notify()

 

       ** sychronized로 동기화 하면 공유 데이터를 보호할 수 있으나, 

          특정 쓰레드가 락을 오랜 시간 유지하면 안되기 때문에 wait, notify 메소드가 등장했다.

 

       wait() : 쓰레드가 락을 반납하고 기다리게 한다.

       notify() : 작업을 중단했던 쓰레드가 다시 락을 얻어 작업을 진행할 수 있게 한다.