Hoare의 Monitor와 같이 객체를 사용한 생산자 / 소비자 문제의 구현
Posted 2007/12/26 22:42■ 문제 정의
|
생산자 / 소비자 문제를 Hoare의 Monitor와 같이 객체를 사용하여 구현하시오 |
■ 문제 해결
1. 개발 환경
- 객체 지향 프로그래밍 언어인 Java 5.0 Version을 사용하여 구현한다.
2. Monitor의 특징
- Monitor는 class와 유사하다.
- 내부 자료 자장소와 외부 인터페이스를 위한 함수들로 구성된다.
- 외부 프로세스나 스레드의 모니터 함수 호출에 의한 모니터 진입은 한 프로세스로 제한되어 상호 배제를 보장해야 한다.
- 내부 동기화 도구로서 wait과 signal이 사용된다.
- wait과 signal은 pthread의 condition 개념과 동일하다.
3. Producer / Consumer Modeling
- Producer
• 생산자 Thread 역할을 담당한다.
• Data의 add 메소드를 호출하여 데이터를 추가한다.
- Consumer
• 소비자 Thread 역할을 담당한다.
• Data의 remove 메소드를 호출하여 데이터를 얻어온다.
- Data : Monitor 역할을 한다. 내부적으로 Java에서 지원하는 Linked List 자료구조를 갖고 있으며 최대 100개의 데이터를 갖을 수 있다. 한 번에 하나의 Process만 Data를 사용할 수 있도록 동기화 되어 있다.
- Producer와 Consumer는 공통으로 Data 객체를 공유한다.
4. critical section 문제 해결
- Monitor 문제에서는 Producer와 Consumer Thread는 단지 Data 객체의 add와 remove 객체만 호출한다.
- 다소 지저분해 보이고 신경써야 하는 동기화 코드는 Data Monitor 안에서 구현해서 Application에서는 신경쓰지 않도록 구현해 놓았다.
5. Java에서 사용한 동기화 코드
- synchronized(this)
• Data 객체를 통체로 통기화 시킨다.
• 한번에 하나의 Thread만이 Data 객체를 건드릴 수 있다.
- wait()
• 동기화 블록 내에서만 사용할 수 있으며, Thread가 wait을 호출하면 그 때까지 자신이 객체에 걸어 놓았던 모든 lock을 풀고, wait()이 호출된 객체의 대기실(waiting pool)에서 기다리게 된다.
• 그러다가 다른 Thread에 의해서 그 객체에 대해 notify()를 호출하면 객체의 대기실을 벗어나서 다시 실행대기상태, 즉 객체의 waiting queue를 벗어나 실행대기 열에서 자신이 실행될 차례를 기다리는 상태가 된다.
- notify()
• 객체의 waiting queue에 있는 Thread 중의 하나만을 깨운다.
- notifyAll()
• waiting queue에 있는 모든 Thread를 깨운다.
6. Thread의 소멸
- Java의 Thread는 run() method안의 내용을 수행한 후에 자동으로 소멸된다.
■ 소 스
|
import java.util.LinkedList; import java.util.List; /** * Data Monitor를 정의합니다. */ public class Data { // 내부적인 자료구조는 Linked List 사용 private List<Integer> data; private static int MAX = 100;
public Data() { data = new LinkedList<Integer>(); }
/** * Data를 추가한다. * @param value 추가할 Data */ public void add(int value) { synchronized(this) { try { // 삽입하기 전에 Linked List가 꽉 찼으면 기다린다. while(data.size() == MAX) wait(); } catch(InterruptedException e) { }
// data를 추가한다. data.add(value);
// wait한 Thread를 깨워준다. (stack되지 않는다.) notifyAll(); System.out.printf("Producer add Data(%03d) - count(%03d)\n", value, data.size()); } }
/** * Data를 소비한다. * @return 소비한 Data */ public synchronized int remove() { int value = 0; synchronized(this) { try { // 소비하기 전에 Linked List가 비었으면 기다린다. while(data.size() == 0) wait(); } catch(InterruptedException e) { } // data를 하나 소비한다. value = data.remove(0);
// wait한 Thread를 깨워준다. (stack되지 않는다.) notifyAll();
System.out.printf("Consumer remove Data(%03d) - count(%03d)\n", value, data.size()); } return value; }
public static void main(String[] args) { Data data = new Data(); Producer producer = new Producer(data); Consumer consumer = new Consumer(data);
producer.start(); consumer.start(); } } /** * Producer Thread를 정의한다. */ class Producer implements Runnable { private Data data; private Thread producerThread; public Producer(Data sharedData) { data = sharedData; producerThread = new Thread(this); }
public void start() { producerThread.start(); }
/** * data에 1000개의 data를 생산한다. */ public void run() { for(int i=0 ; i<1000 ; i++) data.add(i); } } /** * Consumer Thread를 정의한다. */ class Consumer implements Runnable { private Data data; private Thread consumerThread; public Consumer(Data sharedData) { data = sharedData; consumerThread = new Thread(this); }
public void start() { consumerThread.start(); }
/** * data에 1000개의 data를 소비한다. */ public void run() { for(int i=0 ; i<1000 ; i++) data.remove(); } } |
■ 결과화면
~ ~ ~ ~ ~ 중략 ~ ~ ~ ~ ~ ~
Consumer remove Data(842) - count(006)
Consumer remove Data(843) - count(005)
Consumer remove Data(844) - count(004)
Consumer remove Data(845) - count(003)
Consumer remove Data(846) - count(002)
Consumer remove Data(847) - count(001)
Consumer remove Data(848) - count(000)
Producer add Data(849) - count(001)
Producer add Data(850) - count(002)
Producer add Data(851) - count(003)
Producer add Data(852) - count(004)
Producer add Data(853) - count(005)
Producer add Data(854) - count(006)
Producer add Data(855) - count(007)
Producer add Data(856) - count(008)
Producer add Data(857) - count(009)
Producer add Data(858) - count(010)
Producer add Data(859) - count(011)
Producer add Data(860) - count(012)
Producer add Data(861) - count(013)
Producer add Data(862) - count(014)
Producer add Data(863) - count(015)
Producer add Data(864) - count(016)
Producer add Data(865) - count(017)
Producer add Data(866) - count(018)
Producer add Data(867) - count(019)
Producer add Data(868) - count(020)
Producer add Data(869) - count(021)
Producer add Data(870) - count(022)
Producer add Data(871) - count(023)
Producer add Data(872) - count(024)
Producer add Data(873) - count(025)
Producer add Data(874) - count(026)
Producer add Data(875) - count(027)
Producer add Data(876) - count(028)
Producer add Data(877) - count(029)
Producer add Data(878) - count(030)
Producer add Data(879) - count(031)
Producer add Data(880) - count(032)
Producer add Data(881) - count(033)
Producer add Data(882) - count(034)
Producer add Data(883) - count(035)
Producer add Data(884) - count(036)
Producer add Data(885) - count(037)
Producer add Data(886) - count(038)
Producer add Data(887) - count(039)
Producer add Data(888) - count(040)
Producer add Data(889) - count(041)
Producer add Data(890) - count(042)
Producer add Data(891) - count(043)
Producer add Data(892) - count(044)
Producer add Data(893) - count(045)
Producer add Data(894) - count(046)
Producer add Data(895) - count(047)
Producer add Data(896) - count(048)
Consumer remove Data(849) - count(047)
Producer add Data(897) - count(048)
Producer add Data(898) - count(049)
Producer add Data(899) - count(050)
Producer add Data(900) - count(051)
Producer add Data(901) - count(052)
Producer add Data(902) - count(053)
Producer add Data(903) - count(054)
Producer add Data(904) - count(055)
Producer add Data(905) - count(056)
Consumer remove Data(850) - count(055)
Consumer remove Data(851) - count(054)
Consumer remove Data(852) - count(053)
Consumer remove Data(853) - count(052)
Consumer remove Data(854) - count(051)
Consumer remove Data(855) - count(050)
Consumer remove Data(856) - count(049)
Consumer remove Data(857) - count(048)
Consumer remove Data(858) - count(047)
Consumer remove Data(859) - count(046)
Consumer remove Data(860) - count(045)
Consumer remove Data(861) - count(044)
Consumer remove Data(862) - count(043)
Consumer remove Data(863) - count(042)
Consumer remove Data(864) - count(041)
Consumer remove Data(865) - count(040)
Consumer remove Data(866) - count(039)
Consumer remove Data(867) - count(038)
Consumer remove Data(868) - count(037)
Consumer remove Data(869) - count(036)
Consumer remove Data(870) - count(035)
Consumer remove Data(871) - count(034)
Consumer remove Data(872) - count(033)
Consumer remove Data(873) - count(032)
Consumer remove Data(874) - count(031)
Consumer remove Data(875) - count(030)
Consumer remove Data(876) - count(029)
Consumer remove Data(877) - count(028)
Consumer remove Data(878) - count(027)
Consumer remove Data(879) - count(026)
Consumer remove Data(880) - count(025)
Consumer remove Data(881) - count(024)
Consumer remove Data(882) - count(023)
Consumer remove Data(883) - count(022)
Consumer remove Data(884) - count(021)
Consumer remove Data(885) - count(020)
Consumer remove Data(886) - count(019)
Consumer remove Data(887) - count(018)
Consumer remove Data(888) - count(017)
Consumer remove Data(889) - count(016)
Consumer remove Data(890) - count(015)
Consumer remove Data(891) - count(014)
Consumer remove Data(892) - count(013)
Consumer remove Data(893) - count(012)
Consumer remove Data(894) - count(011)
Consumer remove Data(895) - count(010)
Consumer remove Data(896) - count(009)
Consumer remove Data(897) - count(008)
Consumer remove Data(898) - count(007)
Consumer remove Data(899) - count(006)
Consumer remove Data(900) - count(005)
Consumer remove Data(901) - count(004)
Consumer remove Data(902) - count(003)
Consumer remove Data(903) - count(002)
Consumer remove Data(904) - count(001)
Consumer remove Data(905) - count(000)
Producer add Data(906) - count(001)
Producer add Data(907) - count(002)
Producer add Data(908) - count(003)
Producer add Data(909) - count(004)
Producer add Data(910) - count(005)
Producer add Data(911) - count(006)
Producer add Data(912) - count(007)
Producer add Data(913) - count(008)
Producer add Data(914) - count(009)
Producer add Data(915) - count(010)
Producer add Data(916) - count(011)
Producer add Data(917) - count(012)
Producer add Data(918) - count(013)
Producer add Data(919) - count(014)
Producer add Data(920) - count(015)
Producer add Data(921) - count(016)
Producer add Data(922) - count(017)
Producer add Data(923) - count(018)
Producer add Data(924) - count(019)
Producer add Data(925) - count(020)
Producer add Data(926) - count(021)
Producer add Data(927) - count(022)
Producer add Data(928) - count(023)
Producer add Data(929) - count(024)
Producer add Data(930) - count(025)
Producer add Data(931) - count(026)
Producer add Data(932) - count(027)
Producer add Data(933) - count(028)
Producer add Data(934) - count(029)
Producer add Data(935) - count(030)
Producer add Data(936) - count(031)
Producer add Data(937) - count(032)
Producer add Data(938) - count(033)
Producer add Data(939) - count(034)
Producer add Data(940) - count(035)
Producer add Data(941) - count(036)
Producer add Data(942) - count(037)
Producer add Data(943) - count(038)
Producer add Data(944) - count(039)
Producer add Data(945) - count(040)
Producer add Data(946) - count(041)
Producer add Data(947) - count(042)
Producer add Data(948) - count(043)
Producer add Data(949) - count(044)
Producer add Data(950) - count(045)
Producer add Data(951) - count(046)
Producer add Data(952) - count(047)
Producer add Data(953) - count(048)
Producer add Data(954) - count(049)
Producer add Data(955) - count(050)
Producer add Data(956) - count(051)
Producer add Data(957) - count(052)
Producer add Data(958) - count(053)
Producer add Data(959) - count(054)
Producer add Data(960) - count(055)
Producer add Data(961) - count(056)
Producer add Data(962) - count(057)
Producer add Data(963) - count(058)
Producer add Data(964) - count(059)
Producer add Data(965) - count(060)
Producer add Data(966) - count(061)
Producer add Data(967) - count(062)
Producer add Data(968) - count(063)
Producer add Data(969) - count(064)
Producer add Data(970) - count(065)
Producer add Data(971) - count(066)
Producer add Data(972) - count(067)
Producer add Data(973) - count(068)
Producer add Data(974) - count(069)
Producer add Data(975) - count(070)
Producer add Data(976) - count(071)
Producer add Data(977) - count(072)
Producer add Data(978) - count(073)
Producer add Data(979) - count(074)
Producer add Data(980) - count(075)
Producer add Data(981) - count(076)
Producer add Data(982) - count(077)
Producer add Data(983) - count(078)
Producer add Data(984) - count(079)
Producer add Data(985) - count(080)
Producer add Data(986) - count(081)
Producer add Data(987) - count(082)
Producer add Data(988) - count(083)
Producer add Data(989) - count(084)
Producer add Data(990) - count(085)
Producer add Data(991) - count(086)
Producer add Data(992) - count(087)
Producer add Data(993) - count(088)
Producer add Data(994) - count(089)
Producer add Data(995) - count(090)
Consumer remove Data(906) - count(089)
Consumer remove Data(907) - count(088)
Consumer remove Data(908) - count(087)
Consumer remove Data(909) - count(086)
Consumer remove Data(910) - count(085)
Consumer remove Data(911) - count(084)
Consumer remove Data(912) - count(083)
Consumer remove Data(913) - count(082)
Consumer remove Data(914) - count(081)
Consumer remove Data(915) - count(080)
Consumer remove Data(916) - count(079)
Consumer remove Data(917) - count(078)
Consumer remove Data(918) - count(077)
Consumer remove Data(919) - count(076)
Consumer remove Data(920) - count(075)
Consumer remove Data(921) - count(074)
Consumer remove Data(922) - count(073)
Consumer remove Data(923) - count(072)
Consumer remove Data(924) - count(071)
Consumer remove Data(925) - count(070)
Consumer remove Data(926) - count(069)
Consumer remove Data(927) - count(068)
Consumer remove Data(928) - count(067)
Consumer remove Data(929) - count(066)
Consumer remove Data(930) - count(065)
Consumer remove Data(931) - count(064)
Consumer remove Data(932) - count(063)
Consumer remove Data(933) - count(062)
Consumer remove Data(934) - count(061)
Consumer remove Data(935) - count(060)
Consumer remove Data(936) - count(059)
Consumer remove Data(937) - count(058)
Consumer remove Data(938) - count(057)
Consumer remove Data(939) - count(056)
Consumer remove Data(940) - count(055)
Consumer remove Data(941) - count(054)
Consumer remove Data(942) - count(053)
Consumer remove Data(943) - count(052)
Consumer remove Data(944) - count(051)
Consumer remove Data(945) - count(050)
Consumer remove Data(946) - count(049)
Consumer remove Data(947) - count(048)
Consumer remove Data(948) - count(047)
Consumer remove Data(949) - count(046)
Consumer remove Data(950) - count(045)
Consumer remove Data(951) - count(044)
Consumer remove Data(952) - count(043)
Consumer remove Data(953) - count(042)
Consumer remove Data(954) - count(041)
Consumer remove Data(955) - count(040)
Consumer remove Data(956) - count(039)
Consumer remove Data(957) - count(038)
Consumer remove Data(958) - count(037)
Consumer remove Data(959) - count(036)
Consumer remove Data(960) - count(035)
Consumer remove Data(961) - count(034)
Consumer remove Data(962) - count(033)
Consumer remove Data(963) - count(032)
Consumer remove Data(964) - count(031)
Consumer remove Data(965) - count(030)
Consumer remove Data(966) - count(029)
Consumer remove Data(967) - count(028)
Consumer remove Data(968) - count(027)
Consumer remove Data(969) - count(026)
Consumer remove Data(970) - count(025)
Consumer remove Data(971) - count(024)
Consumer remove Data(972) - count(023)
Consumer remove Data(973) - count(022)
Consumer remove Data(974) - count(021)
Consumer remove Data(975) - count(020)
Consumer remove Data(976) - count(019)
Consumer remove Data(977) - count(018)
Consumer remove Data(978) - count(017)
Consumer remove Data(979) - count(016)
Consumer remove Data(980) - count(015)
Consumer remove Data(981) - count(014)
Consumer remove Data(982) - count(013)
Consumer remove Data(983) - count(012)
Consumer remove Data(984) - count(011)
Consumer remove Data(985) - count(010)
Consumer remove Data(986) - count(009)
Consumer remove Data(987) - count(008)
Consumer remove Data(988) - count(007)
Consumer remove Data(989) - count(006)
Consumer remove Data(990) - count(005)
Consumer remove Data(991) - count(004)
Consumer remove Data(992) - count(003)
Consumer remove Data(993) - count(002)
Consumer remove Data(994) - count(001)
Consumer remove Data(995) - count(000)
Producer add Data(996) - count(001)
Producer add Data(997) - count(002)
Producer add Data(998) - count(003)
Producer add Data(999) - count(004)
Consumer remove Data(996) - count(003)
Consumer remove Data(997) - count(002)
Consumer remove Data(998) - count(001)
Consumer remove Data(999) - count(000)
'C.S.E > Java' 카테고리의 다른 글
| 제 9회 한국 자바 개발자 컨퍼런스 이벤트에 참여하세요!! (2) | 2008/02/05 |
|---|---|
| 제 9회 자바 개발자 컨퍼런스 안내 (2) | 2008/01/22 |
| Hoare의 Monitor와 같이 객체를 사용한 생산자 / 소비자 문제의 구현 (0) | 2007/12/26 |
| 플래시로 배우는 자바 제2권 발간 (0) | 2007/09/15 |
| Introduction J2ME (0) | 2007/07/07 |
| HP Jena Tutorial 및 Persistent한 Model 만들기 (0) | 2007/07/07 |
- Filed under : C.S.E/Java
- Comment Trackback
이올린에 북마크하기