Multi-Consumer / Multi-Producer

 

หลายคนติดดื่มน้ำอัดลมเป็นชีวิตจิตใจ ซึ่งไม่ใช่ผลดีต่อสุขภาพเลย โปรดเพลาๆ ลงบ้างเนื่องจากน้ำอัดลมมีน้ำตาลเป็นจำนวนมาก สารอาหารเป็นจำนวนน้อย ยิ่งกินมากๆ จะไม่ดีเพราะเปลือง

 

โจทย์การบ้านคราวนี้เกี่ยวข้องกับน้ำอัดลม โดยหยิบตัวอย่างมาจากตู้ใส่น้ำอัดลมในร้านสะดวกซื้อ ภายในตู้แต่ละใบจะมีถาดเล็กๆ ซอยเป็นช่องสำหรับใส่กระป๋องน้ำอัดลม เจ้าหน้าที่ร้านจะซุ่มอยู่ข้างหลังตู้แล้วคอยเติ่มกระป๋องน้ำอัดลมลงไปเพิ่มเวลาน้ำอัดลมลดจำนวนลง และตรงกันข้ามกันผู้ซื้อจะเปิดตู้น้ำอัดลมจากด้านหน้า และหยิบน้ำอัดลมออกจากแถวตามจำนวนที่ต้องการ

 

เนื่องจากวันนี้อากาศร้อน เพราะ season change ทำให้มีผู้ซื้อจำนวนมากต้องการดื่มน้ำเย็นดับกระหาย แน่นอนเจ้าหน้าที่ก็ต้องทำงานหนักเป็นธรรมดา พี่ TA

ได้จำลองสถานการณ์ในวันนี้ให้เราแล้วผ่านโปรแกรม PepsiTray.jar นิสิตสามารถดาว์นโหลดมาลองศึกษาและดูเป็นตัวอย่าง (วิธีรัน เข้า console แล้วพิ่มพ์ java –jar ตำแหน่งของ_jar_file)

โจทย์กำหนดให้มีความต้องการดังนี้

ItemTray ตัวแทนถาดใส่น้ำอัดลม

- โดยถาดแต่ละอันสามารถบรรจุน้ำอัดลมได้สูงสุด 10 กระป๋อง ไม่สามารถใส่ได้มากกว่านั้น

- หากต้องการจะเพิ่มน้ำอัดลมลงในถาด ต้องเติมเข้าจากด้านหลังเสมอ โดยใส่ลงไปทีละ 1 กระป๋อง

- หากต้องการจะนำน้ำอัดลมออกจากถาด ต้องดึงออกจากด้านหน้าเสมอ โดยเอาออกได้มากกว่า 1 กระป๋อง

 

Consumer ตัวแทน Thread ของผู้บริโภค

ผู้ซื้อค่อนข้างจะกระหายน้ำมากวันนี้ โจทย์กำหนดให้

- Consumer จะสุ่มเข้ามาซื้อน้ำอัดลมแต่ละครั้งภายใน 10 วินาที

- และแต่ละครั้ง Consumer จะสุ่มจำนวนน้ำอัดลมที่ตัวเองต้องการ ตั้งแต่ 0 ถึง 10 (สูงสุดที่ถาดให้ได้)

- หากในถาดมีจำนวนน้ำอัดลมน้อยกว่าจำนวนที่ Consumer ต้องการ Consumer จะต้องรอ (wait) จนกว่าภายในถาดจะมีจำนวนที่มากพอสำหรับความต้องการครั้งนั้น

- เนื่องจากไม่อยากให้ผู้ซื้อต่อคิวนานเกินไป จึงกำหนดให้มี Consumer ที่เข้ามาใช้บริการได้พร้อมกันหลายเส้น (หลาย Thread) โจทย์ต้องการให้นิสิตจำลองเหตุการณ์มี Thread Consumer 2 เส้นวิ่งเข้าดึงน้ำอัดลมจาก ItemTray เดียวกัน

 

 

Producer ตัวแทนผู้จำหน่าย

เนื่องจากมีผู้ซื้อจำนวนมาก ทำให้ต้องเพิ่มจำนวน Producer ตามมาด้วย โดยกำหนดให้ว่า

- Producer แต่ละคนสามารถทำคาบใส่น้ำอัดลม 1 กระป๋อง ใช้เวลา 1.5 วินาที โดยแต่ละกระป๋องจะมี id ประจำตัวไม่ซ้ำกัน

- เนื่องจากข้อจำกัดของ ItemTray ที่สามารถใส่ได้แค่ทีละกระป๋อง เพื่อให้ทันกับความต้องการของ Consumer โจทย์กำหนดให้มี Producer 2 คน

(Thread) ช่วยกันใส่น้ำอัดลมลงใน ItemTray เดียวกัน

 

Main จำลองสถานการณ์ 30 วินาที

จงเขียนโปรแกมจำลองสถานการณ์ที่เกิดขึ้นทั้งหมดเป็นเวลา 30 วินาที เพื่อดูความสามารถในการให้บริการ และพิสูจน์ความสามารถของนิสิตเอง โดยพี่ TA ได้ขึ้นโครง Class และ method ไว้ให้แล้ว (PepsiTray_src.zip) ให้นิสิต implement ส่วนที่เหลือเอง และเนื่องจากนิสิตผ่านโจทย์ Thread มาจนชำนาญสนุกสนานแล้ว คราวนี้จะใบ้ให้น้อยลง เพื่อให้นิสิตได้พิสูจน์ความสามารถของตัวเอง

คำพูดที่เกี่ยวข้อง

 

- "Consumer 1 : I want 8 pepsi can(s)." ใช้เมื่อ Thread Consumer ที่มีชื่อว่า Consumer 1 สุ่มว่าต้องการน้ำอัดลมในครั้งนั้น 8 กระป๋อง

 

- "Producer 1 : try to add Pepsi id : 1" ใช้เมื่อ Thread Producer ที่มีชื่อว่า Producer 1 พยายามจะใส่น้ำอัดลม id 1 ลงถาด

 

- "Item Tray : add Item Pepsi id : 1 from Producer 1 success." ใช้เมื่อ ItemTray รายงานผลความสำเร็จในการพยายามใส่น้ำอัดลม id 1 ของ Thread Producer 1

 

- "Item Tray : tray reach maximum amount. Producer 1, Pepsi id : 11 have to wait." ใช้เมื่อ ItemTray รายงานผลความล้มเหลวในการพยายามใส่น้ำอัดลม id 11

ของ Thread ที่มีชื่อว่า Producer 1 เนื่องมาจากสาเหตุ ภายในถาดมีน้ำอัดลมบรรจุเต็มจำนวนสูงสุดที่ตัวเองสามารถบรรจุได้

 

- "Consumer 1 : I receive 8 pepsi can(s)."

        - pepsi id : Pepsi id : 1

        - pepsi id : Pepsi id : 2

        - pepsi id : Pepsi id : 3

        - pepsi id : Pepsi id : 4

        - pepsi id : Pepsi id : 5

        - pepsi id : Pepsi id : 6

        - pepsi id : Pepsi id : 7

        - pepsi id : Pepsi id : 8

 

               ใช้เมื่อรายงานผลความสำเร็จของคำร้องขอน้ำอัดลม 8 กระป๋องของ Thread ที่มีชื่อ Consumer 1 โดยแจกแจง id ทั้งหมดของน้ำอัด

ลม

ความรู้ที่ต้องมี -