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 ทั้งหมดของน้ำอัด
ลม
ความรู้ที่ต้องมี
-