Thread
할당했다고 돌지 않는다. 반드시 new Thread() 객체를 생성해서 코드를 넣고th.start()를 해줘야 한다.
sleep(); 일정 초 동안 일시정지 : wait큐에 지정 시간 동안 넣고 다시 cpu에 스케줄러에 할당 한다.
wait() : 런어블 객체를 웨이트 큐에 넣는다. notify()는 런어블 객체를 스케줄러로 할당하는 것이다. notifyall() 하면 웨이트 큐에 있는 모든 객체를 cpu 스케줄러를 통해 할당한다. 큐이기때문에 특정 런어블 객체를 할당할 때는 모든 객체를 빼서 잠시 할당한 후 특정 객체를 빼고 원래 있었던 나머지 객체를 웨이트 큐에 다시 넣는다.
ex:) 1초 후에 실행하려고해서 sleep(1000)했다고 1초를 보장하지 않는다. 약간 넘을수있다.
clock tick 인터럽트가 발생해서 이다.
쓰레드에 인터럽트를 걸었다고 해서 쓰레드가 멈추는 것이아니다. 체크를 한다.
동기화
이렇게 하면 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 |