본문 바로가기

AdvancedJava

[4일차] Thread, syncronized,생산자 소비자

Thread

쓰레드 안에 run() 이라는 함수를 오버라이드 해서 코드를 넣을 수 있다. 


runnable이라는 객체를 넘겨줘서 코드를 넣어줘도 된다. 

ex:) new Thread(new Runnable(){
public void run(){



print"HI"
}

})



할당했다고 돌지 않는다. 반드시  new Thread() 객체를 생성해서 코드를 넣고th.start()를 해줘야 한다. 




sleep(); 일정 초 동안 일시정지 : wait큐에 지정 시간 동안 넣고 다시 cpu에 스케줄러에 할당 한다. 


wait() : 런어블 객체를 웨이트 큐에 넣는다. notify()는 런어블 객체를 스케줄러로 할당하는 것이다. notifyall() 하면 웨이트 큐에 있는 모든 객체를 cpu 스케줄러를 통해 할당한다. 큐이기때문에 특정 런어블 객체를 할당할 때는 모든 객체를 빼서 잠시 할당한 후 특정 객체를 빼고 원래 있었던 나머지 객체를 웨이트 큐에 다시 넣는다. 


ex:) 1초 후에 실행하려고해서 sleep(1000)했다고 1초를 보장하지 않는다. 약간 넘을수있다. 

clock tick 인터럽트가 발생해서 이다. 



쓰레드에 인터럽트를 걸었다고 해서 쓰레드가 멈추는 것이아니다. 체크를 한다. 



동기화 

두개의 쓰레드가 같은객체를 동시에 사용못하게 할때,
하나는 메소드에 쓸수있고,

하나는 블록{} 에 쓸수있다. 

거기 들어가는 object가 중요하다. 동일한 object에 대해서는 획득하기 전에는 다른쓰레드는 wait() 상태이다. 

메소드에서 걸때는 인스턴스 메소드일때는 그 객체를 잡은 것이다. 

static메소드에 걸면 클래스를 잡은 것이다. 

메소드에 걸면 다른객체로 접근했을때, 접근이 가능하다. 

그러면 모든 쓰레드가 동시에 접근못하게 하려며?? 

class A{
static object lock  = new object();
 synchronized(lock){
}

}

이렇게 하면 lock을 얻기 전까지 모든 쓰레드가 wait()

생산자 소비자 

생산자-소비자 문제(producer-consumer problem)는 여러 개의 프로세스를 어떻게 동기화할 것인가에 관한 고전적인 문제이다. 한정 버퍼 문제(bounded-buffer problem)라고도 한다.

유한한 개수의 물건(데이터)을 임시로 보관하는 보관함(버퍼)에 여러 명의 생산자들과 소비자들이 접근한다. 생산자는 물건이 하나 만들어지면 그 공간에 저장한다. 이때 저장할 공간이 없는 문제가 발생할 수 있다. 소비자는 물건이 필요할 때 보관함에서 물건을 하나 가져온다. 이 때는 소비할 물건이 없는 문제가 발생할 수 있다.




생산자
 do {
     ...
     아이템을 생산한다.
     ...
     wait(empty);  //버퍼에 빈 공간이 생길 때까지 기다린다.
     wait(mutex); //임계 구역에 진입할 수 있을 때까지 기다린다.
     ...
     아이템을 버퍼에 추가한다.
     ...
     signal(mutex); //임계 구역을 빠져나왔다고 알려준다.
     signal(full);  //버퍼에 아이템이 있다고 알려준다.
 } while (1);
소비자
 do {
     wait(full);    //버퍼에 아이템이 생길 때까지 기다린다.
     wait(mutex);
     ...
     버퍼로부터 아이템을 가져온다.
     ...
     signal(mutex);
     signal(empty); //버퍼에 빈 공간이 생겼다고 알려준다.
     ...
     아이템을 소비한다.
     ...
 } while (1);


'AdvancedJava' 카테고리의 다른 글

객체 직렬화  (0) 2016.08.22
[4일차]cuncurrent, Thread pool  (0) 2016.07.08
[3일차]쓰레드 쓰레드  (0) 2016.07.07
[3일차] 문자세트와 문자 인코딩 그리고 직렬화...  (0) 2016.07.07
[3일차] IO  (0) 2016.07.07