[JAVA]스레드

Date:     Updated:

카테고리:

태그:

[33] 스레드

33.1. 프로세스 (Process)

  • OS(Operating System)는 동시에 여러개의 프로그램이 실행됨.
  • process
    • 프로그램이 실행 중인 상태
    • 프로그램이 실행 되면 OS부터 메모리를 할당받아 프로세스 상태가 됨.

33.2. 스레드 (Thread)

  • 하나의 프로세스는 하나 이상의 thread를 가지게 됨
  • 실제 작업(task)을 수행하는 단위는 thread임.

33.3. 멀티 스레딩 (Multi-Threading)

  • 여러 thread가 동시에 수행되는 프로그래밍
  • 여러 작업(task)이 동시에 실행되는 효과
  • thread는 각각 자신만의 작업 공간을 가짐 (context)
  • 각 thread 사이에서 공유하는 자원이 있을 수 있음
    • static, instance
  • 여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음.
  • critical section
    • 여러 thread가 공유하는 자원중 경쟁이 발생하는 부분
  • critical section에 대한 동기화(Synchronization)를 구현해야 함
    • 구현하지 않으면 오류가 발생할 수 있음.

33.4. 자바 Thread 만들기

  • Thread 클래스 상속
  • Runnable 인터페이스 구현
  • 람다식으로 Runnable 구현
    • run()

33.5. Thread Status

            Runn 상태 
            thread
                /\    
                ||
                || CPU 배분
                ||                        sleep(), join(),wait()
start ==> Runnable 상태              --------------------------> Not Runnable 상태 
            thread   thread  thread                                 thread
            thread   thread  thread                                    thread
            thread   thread  thread     sleep() -> 시간 지나면
                ||                       join() -> other thread exits
                ||                       wait() -> notify(), notifyAll() 
                ||                   <---------------------------
                || thread 종료
                \/
                Dead  

33.6. Thread 클래스의 여러 메서드들

  • Thread 우선순위
    • MIN_PRIORITY(=- ~ MAX_PRIORITY(=10)
    • 디폴트 우선순위 : NORM_PRIORITY(=-
    • 우선 순위가 높은 Thread가 CPU의 배분을 받을 확률이 높음
    • getPriority() / setPriority(int newPriority)
  • join()
    • 동시에 두 개 이상의 Thread가 실행 될 때, 다른 Thread의 결과를 참조하여 실행해야하는 경우 join() 함수를 사용.
    • join()를 호출한 Thread가 not-Runnable 상태가 감.
    • 다른 Thread의 수행이 끝나면 Runnable 상태로 돌아옴.
  • Thread 종료하기
    • 무한 반복의 경우 while(flag)의 flag 변수값을 false로 바꾸어 종료를 시킴.

33.7. 멀티 Thread 프로그래밍에서 동기화

  • critical section
    • 두 개 이상의 thread가 동시에 접근하고 경우 문제가 생길수 있음
    • 그래서 동시에 접근할 수 없는 영역
      thread1     get()[critical section] release()
      thread2     get()                           [critical section] release()
      thread3     get()                                                       [critical section] release()  
      
    • 한 순간 오직 하나의 thread만이 critical section을 얻을 수 있고, 나머지 thread들은 대기(blocking) 상태가 됨.
      • 해당 thread만이 critical section에 들어갈수 있음.
  • 동기화 (Synchronization)
    • 두 개의 thread가 같은 객체에 접근할 경우, 동시에 접근함으로써 오류가 발생
    • 동기화는 임계영역에 접근한 경우 공유자원을 lock하여 다른 thread의 접근을 제어
    • 동기화를 잘못 구현하면 deadlock에 빠질수 있음

    • 자바에서는 synchronized 메서드, synchronized 블럭을 사용
      • synchronized 메서드
        • deadlock을 방지하는 기술이 제공되지 않으므로 synchronized 메서드에서 다른 synchronized 메서드는 호출하지 않도록 함.
  • wait() / notify() 활용한 동기화
    • 리소스가 어떤 조건에서 더 이상 유효하지 않은 경우 리소스를 기다리기 위해 wait() 메서드 이용함.
    • wait() 상태가 된 Thread는 notify() 호출될 때까지 기다림.
    • 유효한 자원이 생기면 notify()가 호출되고 wait()하고 있는 Thread 중 무작위로 하나의 Thread를 재시작 하도록 함.
    • notifyAll()이 호출되는 경우 wait()하고 있는 모든 Thread가 재시작 됨.
      • 이 경우 유효한 리소스만큼의 Thread만이 수행될 수 있음
      • 자원을 갖지 못한 Thread의 경우는 다시 wait() 상태로 만듦

JAVA 카테고리 내 다른 글 보러가기

댓글 남기기