본문 바로가기

안드로이드

주말공부 리스트

1.미디어코덱3차에 관해서

2. 쓰레드에 관해서

BlockingQueue : 꽉찬 큐에 enqueue를 요청하거나 빈 큐에 dequeue요청 하면 wait을 통해서 Thread를 죽인다.

                           enque ,deque 끝에서는 notifyAll 을 통해서 wait중인 쓰레드를 살린다.

 

ConvertLayer ( VideoLayer  vl) 

  vl 을 inputVideoLayer 로 컨버팅 하고

  vl내부에 있는 item 들을 하나씩 InputVideoItem 으로 변경해서   ( Item : 비디오, 오디오, 이미지, 데코레이션, 캡션, 두들 )

  inputvideoLayer에 add Item 해준다.

 

Manager 는 getMap 으로  <int,Element> 를 가져옴

Element : Video Item Layer LayerGroup Manager Content 

 

쓰레드 라이브러리 : OS 마다 다른 걸 썻었는데, 이제는 C++ 에서 사용하는 thread 라이브러리 쓰면 끝.

 

PrintMessage{

   cout << " 하이 " << endl;

}

int main(){

     PrintMessage() ;  

     std::thread thread(PrintMessage , " Child 쓰레드 입니다 "); //

}

메인쓰레드가 끝나면 어떻게 될까  > 자녀쓰레드가 아직 남아있으면 터진다.   그래서 떨어뜨리기 해야한다. thread.detach();

 

=======

https://www.tutorialspoint.com/importance-of-wait-notify-and-notifyall-methods-in-java 이해가 잘안됨.

쓰레드는 wait, notify, notifyAll을 통해서 서로 커뮤니케이션 할 수 있다. 

final 로 Object클래스에 정의되어 있고, synchronized 처리되어있는 {}  범위 안에서만 사용 가능하다.

wait() 메소드는 다른 쓰레드가 notify , notifyAll 을 부를때까지 현재 쓰레드를 wait 하게 만든다.  

wait() 은 가지고 있던 고유 lock 을 해제하고 thread 를 잠들게 한다.

wait를 만나게 되면 해당 thread는 해당 객체의 모니터링 락에 대한 권한을 가지고 있다면 모니터링 락의 권한을 놓고 대기한다

notify() 는 그 오브젝트 모니터에서 waiting 하고 있던 임의의 하나의 쓰레드를 깨웁니다.( wait을 종료시킵니다.  , RUNNABLE 상태로 만듭니다.) 

notify() 는 그 오브젝트 모니터에서 waiting 하고 있던 모든 쓰레드를 깨웁니다

현재 쓰레드가 object's monitor 의 owner가 아니면, IllegalMonitorStateException 을 발생시킵니다

sleep() 은 지정된 밀리초 동안 현재 Thread 를 일시 중단한다. 

 

========

wait()

Lock을 소유한 Thread가 obj.wait()를 수행하는 경우 현재 Thread는 일시정지 되고 obj의 wait set(가상의 개념)으로 들어가게 된다. Thread가 obj내부에서 wait하고 있다고 생각하면 이해가 쉽다. wait()를 실행하기 위해서는 Thread가 lock을 소유하고 있어야 하고 wait가 수행되면 lock이 자동으로 해제되어 다른 Thread가 접근할수 있게 된다.

  • lock을 소유한 Thread가 lock이 된 obj에 대하여 호출
  • Thread는 lock을 반납하고 obj내부에서 WAITING 혹은 TIMED WAITING상태로 대기l
  • lock이 해제되었기 때문에 obj에 대해서 다른 Thread가 접근 가능

 

일반적인 synchronized의 상황이다. Thread A는 어떤 인스턴스의 lock을 획득하고 synchronized 메소드 블럭에서 wait();를 수행하기 직전인 상황이다. Thread B는 lock에 의해서 인스턴스에 접근을 blocking당하고 있다.  

 

 

 

이때, Thread A가 wait();를 수행하게 되면 Thread A는 WAIT SET(쓰레드 대기실)에서 WAITING, TIMED_WAITING상태로 대기하게 된다. WAIT SET에 들어가는 경우 Thread A는 lock을 반납하기 때문에 Thread B가 synchronized 블락으로 접근이 가능하게 되었다.

 

notify(), notifyAll()

notify(), notifyAll()는 인스턴스의 WAIT SET에서 대기중인 다른 Thread를 깨우는 역할을 한다. notify는 WAIT_SET에 있는 임의의 한개의 Thread 를 다시 RUNNABLE 상태로 변경하고, notifyAll()의 경우는 WAIT_SET에 있는 모든 Thread를 RUNNABLE상태로 변경하는 차이가 있다.

  • 인스턴스의 WAIT SET에 있는 대기중인 Thread 를 깨운다.
  • 깨어난 Thread 는 RUNNABLE상태로 변경되어 다시 실행된다.
  • notify는 하나의 Thread, notifyAll은 모든 Thread 를 깨운다.

 

 

 

 

 

 

 

 

 

 

 

 

 

위에 wait()메소드에 이어서 Thread B가 notify()를 호출하기 직전의 상황이다. WAIT SET에는 Thread A가 대기중에 있다.

 

 

 

Thread B에 의해서 notify()가 호출되면 인스턴스 WAIT SET에 있는 Thread 들 중 임의의 한개를 깨우게 된다. 위 그림의 경우 대기중인 Thread 가 한개이기 때문에 Thread A가 깨어나게 된다. notifyAll이라면 WAIT SET에 있는 모든 Thread 가 깨어난다.

 

 

notify()에 의해서 Thread A가 다시 RUNNABLE 상태가 되어 다시 인스턴스의 접근을 시도한다. 그림은 아직 Thread B가 lock을 갖고 있지만, Thread B가 lock을 해제하게 되면 다시 Thread A가 lock을 획득하게 된다.

요점정리

 

  • wait(), notify(), notifyAll()은 synchronized 내부(lock을 소유)한 Thread 가 수행한다.
  • 만약 lock이 없는 Thread가 수행하는 경우 IlegalMonotorStateException이 발생한다.
  • wait(), notify(), notifyAll()는 Object에 메소드 이다. 
  • wait()는 Thread 를 WAIT SET으로 대기하게 한다.
  • notify(), notifyAll()은 WAIT SET에서 대기중인 Thread 를 깨운다.