코드 15-1에서 예외 처리나 스레드에서 상호 배제 기법은 사용하지 않았습니다. 코드 목적이 생산자 -소비자 패턴을 익히고 큐 역할을 공부하는 것이기 때문에 최대한 간략하게 구현했습니다. 실행해 보면 동시에 주문을 받고 요리를 하기 때문에 정신이 없을 것입니다. order_service가 키오스크 역할을 합니다. 고객에게서 주문을 받으면 큐에 넣습니다. 요청한 요리가 완성되길 기다리지 않기 때문에 다른 주문을 바로 받을 수 있습니다. cooking_service는 요리 로봇 역할을 합니다. 큐에서 요청을 받아 와 요리를 시작합니다. 요리 시간은 10초입니다. 요리를 완성하면 완성했다고 출력합니다.
코드 아랫부분의 스레드 생성 코드를 보면 order_service는 스레드가 한 개고 cooking_service는 스레드가 세 개입니다. 중요한 점은 order_service는 주문 요청만 받아 큐에 넣고 cooking_service는 큐에서 요청을 받아 와 요리를 한다는 것입니다.
실행 결과를 확인해 볼까요? 멀티스레딩 환경이니 실행 결과는 조금씩 다를 수 있습니다.
1 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 1
[order_service] : 1 번째 음식 피자 주문 완료
2 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 2
[cooking_service 1] : 1 번째 음식 피자 요리 시작
[order_service] : 2 번째 음식 치킨 주문 완료
3 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 1
[cooking_service 2] : 2 번째 음식 치킨 요리 시작
[order_service] : 3 번째 음식 피자 주문 완료
4 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 2
[cooking_service 3] : 3 번째 음식 피자 요리 시작
[order_service] : 4 번째 음식 치킨 주문 완료
5 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 1
[order_service] : 5 번째 음식 피자 주문 완료
6 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 2
[order_service] : 6 번째 음식 치킨 주문 완료
7 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 1
[order_service] : 7 번째 음식 피자 주문 완료
8 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 2
[order_service] : 8 번째 음식 치킨 주문 완료
9 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 1
[order_service] : 9 번째 음식 피자 주문 완료
10 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : 2
[cooking_service 1] : 1 번째 음식 피자 요리 완성
[cooking_service 1] : 4 번째 음식 치킨 요리 시작
[order_service] : 10 번째 음식 치킨 주문 완료
[cooking_service 2] : 2 번째 음식 치킨 요리 완성
[cooking_service 2] : 5 번째 음식 피자 요리 시작
[cooking_service 3] : 3 번째 음식 피자 요리 완성
[cooking_service 3] : 6 번째 음식 치킨 요리 시작
[cooking_service 1] : 4 번째 음식 치킨 요리 완성
[cooking_service 1] : 7 번째 음식 피자 요리 시작
[cooking_service 2] : 5 번째 음식 피자 요리 완성
[cooking_service 2] : 8 번째 음식 치킨 요리 시작
[cooking_service 3] : 6 번째 음식 치킨 요리 완성
[cooking_service 3] : 9 번째 음식 피자 요리 시작
[cooking_service 1] : 7 번째 음식 피자 요리 완성
[cooking_service 1] : 10 번째 음식 치킨 요리 시작
[cooking_service 2] : 8 번째 음식 치킨 요리 완성
[cooking_service 3] : 9 번째 음식 피자 요리 완성
[cooking_service 1] : 10 번째 음식 치킨 요리 완성
모든 주문 처리 완료
큐는 간단한 자료 구조이지만 활용하는 사례에 따라 애플리케이션을 좀 더 성능 좋게 만들 수 있습니다.