[Java]Thread

dnjsrms.lee·2022년 6월 3일
0

Java

목록 보기
14/14
post-thumbnail

쓰레드(Thread)


  • 멀티 쓰레드 프로그래밍 : 여러개의 쓰레드가 동시에 돌아가는 상황 → 생길 수 있는 문제, 어떻게 해결해야 할까?
  • 프로그램이 메모리에 올라 간 상태 : process / 실행이 되기 위해서는 cpu를 점유해야 함
  • 하나의 프로세스가 수행이 되기 위해서는 쓰레드가 하나 생기게 됨.
  • 가끔 하나의 프로그램에서 두개의 쓰레드가 생길 때가 있음. → 쓰레드 2개가 서로 스위치되면서 cpu의 스케줄러가 쓰레드를 배분해주는 것
  • context : 쓰레드는 각각 자신만의 작업 공간이 있음.
  • 동시에 공유하는 자원이 있을 수 있음. 이것을 Shared Resource라고 함(자바에서는 주로 static 개체가 될 것 / C는 global 변수가 될 수 있음)
    • 이러한 공유하는 자원 중 경쟁이 일어날 수 있는데 이 부분을 critical section이라 함
  • 공유 자원에 대해서는 보호를 해줘여 함. <임계영역> - 누가 사용할 때는 다른 쓰레드는 사용하지 못하게끔, 순차적으로 사용하게하는 기법이 필요함(→ 동기화를 구현해주어야 함 - 자바에서는 Synchronized Block, Synchronized method)
  • 쓰레드 만드는 방법
  1. thread class에서 extends 받아서 만드는 방법
  2. 이미 다른 class에서 상속을 받았을 때는 runnable interfacer를 implements하는 방법
  • 쓰레드 우선순위
    • PRIORITY는 1~10
    • 그냥 thread만들면 normal ⇒ 5
    • 우선순위가 높은 thread가 CPU 배분을 받을 확률이 높음
  • join()
    • 동시에 두 개 이상의 Thread가 실행 될 때 사용
    • 1번 쓰레드가 2번 쓰레드에게 join()을 걸게 되면 1번 쓰레드는 Non-Runnable상태로 빠졌다가 2번 쓰레드가 다 끝나면 다시 Runnable상태로 돌아옴
    • join(), wait(), sleep() → InterruptedException
      • Thread가 join(), sleep(), wait() 함수에의해 not-runnable 상태일 때 interrupt() 메서드를 호출하면 다시 runnable 상태가 될 수 있음
  • Thread 종료
    • 무한 반복 일 때 while(flag)의 flag변수 값을 false로 바꿔 종료

멀티 쓰레드 프로그래밍


  1. critical section & semaphore
    • critical section은 두 개 이상의 thread가 동시 접근 할 때 문제가 생길 수 있기에 동시 접근을 제한하는 영역
    • semaphore는 특별한 형태의 시스템 객체. get/release 두 개의 기능 존재
    • `get()`    `critical section`     `release()` ⇒ 동시 접근 불가
    • semaphore를 가진 thread만이 critical section에 들어갈 수 있음

동기화 (synchronization)


  • 임계영역에 접근한 경우 Shared Resource를 lock하여 다른 thread접근 제한
  • 잘못 구현하면 deadlock에 빠질 수 있음
  • synchronized 블럭 & synchronized 메서드
    1. synchronized 블럭

      1. 현재 객체 또는 다른 객체를 lock으로
      • 객체를 쓰는데 동기화가 필요하다 → Block
      synchronized(참조형 수식) {
            수행문;
      }
    2. synchronized 메서드

      1. 객체의 메서드에 synchronized 사용
      2. 그 메서드가 속해있는 객체에 lock → (this)
      3. deadlock 주의 : synchronized 메서드에서 다른 synchronized 메서드호출 X
      • 전반적으로 이 클래스가 다 동기화를 지원해야 한다 → 다 synchronized 사용하면 됌
  • wait() / notify() 메서드 활용한 synchronization
    1. wait()상태가 된 Thread는 notify()가 호출 될 때까지 기다림
    2. notifyAll()이 호출되는 경우 wait() 하고 있는 모든 Thread가 재시작 → 모두다 깨워 경쟁상태가 되는 것이 공평(notifyAll() 메서드의 사용을 권장)
profile
little by little slowly

0개의 댓글