หลายวิธีในการใช้โมเดลผู้ผลิตและผู้บริโภค
ยกตัวอย่างในชีวิตของเราเป็นตัวอย่าง ผลิตภัณฑ์ที่ผลิตโดยโรงงานจะถูกส่งออกเพื่อใช้ภายนอกเสมอ นี่คือแนวคิดของการผลิตและการบริโภค
ในกระบวนการพัฒนาซอฟต์แวร์ที่แท้จริงของเราเรามักจะพบกับสถานการณ์ต่อไปนี้: โมดูลมีหน้าที่สร้างข้อมูลและข้อมูลนี้ถูกประมวลผลโดยโมดูลอื่น (โมดูลที่นี่เป็นแบบทั่วไปซึ่งอาจเป็นคลาสฟังก์ชั่นเธรดกระบวนการ ฯลฯ )
โมดูลที่สร้างข้อมูลเรียกว่าผู้ผลิตอย่างชัดเจน ในขณะที่โมดูลที่ประมวลผลข้อมูลเรียกว่าผู้บริโภค
ประเภทแรก: ใช้ Wait-Notify เพื่อใช้โมเดลผู้ผลิตและผู้บริโภค
1. ผู้ผลิตและผู้บริโภค:
2. ผู้ผลิตหนึ่งรายและผู้บริโภคหลายราย:
ประเภทที่สอง: การใช้คิวการบล็อกเพื่อใช้โมเดลผู้ผลิตและผู้บริโภค
3. ใช้คิวการบล็อกเพื่อใช้รูปแบบผู้ผลิต-ผู้บริโภค
ฉันเชื่อว่าทุกคนไปทานอาหารญี่ปุ่น มีอาหารมื้อที่น่าสนใจมากที่เป็นบาร์บีคิว อาจารย์บาร์บีคิวจะยืนอยู่ด้านข้างและเก็บบาร์บีคิวแล้ววางเนื้อย่างไว้บนจาน และเราเป็นนักทานที่น้ำลายไหลจะนั่งอยู่ข้างๆและเราจะกินต่อไปตราบเท่าที่มีเนื้อสัตว์อยู่บนจาน
ในกรณีชีวิตนี้อาจารย์บาร์บีคิวเป็นโปรดิวเซอร์และเขารับผิดชอบบาร์บีคิว หลังจากการคั่วเขาวางเนื้อบนจานแทนที่จะส่งมันโดยตรงไปยังร้านอาหาร (นั่นคือไม่จำเป็นต้องแจ้งให้นักชิมกินเนื้อสัตว์) หากเนื้อบนจานเต็มอาจารย์จะหยุดพักหนึ่งจนกว่าจะมีคนไปกินบาร์บีคิวก่อนที่จะผลิตเนื้อสัตว์ และนักทานก็จ้องมองที่จานและเมื่อมีเนื้อสัตว์อยู่บนจานเราก็ต้องรับผิดชอบในการกินมัน
ในระหว่างกระบวนการทั้งหมดนักทานและอาจารย์บาร์บีคิวไม่ได้จัดการโดยตรงกัน แต่มีปฏิสัมพันธ์กับจาน
จานทำหน้าที่เป็นแนวคิดบัฟเฟอร์ หากมีการผลิตอะไรให้ใส่ลงจานก็มีขีด จำกัด ขนาด หากเกินขนาดของจานมันจะปิดกั้นการผลิตของผู้ผลิตและรอให้ผู้บริโภคบริโภค เมื่อแผ่นว่างเปล่ามันจะปิดกั้นการบริโภคของผู้บริโภคและรอให้ผู้ผลิตผลิต
การปิดกั้นคิวในระหว่างการเขียนโปรแกรมสามารถตระหนักถึงการทำงานของดิสก์
ลักษณะของการปิดกั้นคิว:
เมื่อองค์ประกอบคิวเต็มให้บล็อกการทำงานของการแทรก;
เมื่อองค์ประกอบคิวว่างเปล่าการดำเนินการซื้อจะถูกบล็อก
ทั้ง Arrayblockingqueue และ LinkedBlockingQueue สนับสนุน FIFO (ครั้งแรกในครั้งแรก) แต่ LinkedBlockingQueue นั้นไม่ได้ จำกัด ในขณะที่ ArrayBlockingQueue ถูกล้อมรอบ
ต่อไปนี้ใช้การปิดกั้นคิวเพื่อนำผู้ผลิตและผู้บริโภคมาใช้:
ผู้ผลิต:
นำเข้า java.util.concurrent.blockingqueue; ผู้ผลิตระดับสาธารณะใช้งาน Runnable {ส่วนตัวการปิดกั้นการปิดกั้นการปิดกั้น) // ตั้งค่าขนาดของแคชคิว การผลิตจะหยุดชั่วคราวหลังจากเกินขนาดนี้ในระหว่างกระบวนการผลิต ส่วนตัว int สุดท้าย queue_size = 10; ผู้ผลิตสาธารณะ (BlockingQueue BlockingQueue) {this.blockingqueue = blockingqueue;} งาน int = 1; @Override โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {ลอง {system.out.println ("การผลิต:" ในขณะที่อำนวยความสะดวกในการดูเอฟเฟกต์เธรด.ผู้บริโภค:
นำเข้า java.util.concurrent.blockingqueue; // ผู้บริโภคระดับสาธารณะผู้บริโภคใช้งานได้ {ส่วนตัวการปิดกั้นครั้งสุดท้ายการปิดกั้นการปิดกั้น) ผู้บริโภคสาธารณะ {system.out.println ("บริโภค:" + blockingqueue.take ()); // ปล่อยให้มันหยุดสักครู่เพื่ออำนวยความสะดวกในการดูด้ายเอฟเฟกต์.ทดสอบ:
นำเข้า java.util.concurrent.blockingqueue; นำเข้า java.util.concurrent.linkedblockingqueue;/** * ผู้ผลิตโหมดผู้บริโภค * ใช้การบล็อกคิวการบล็อกคิว * @author wanggenshen * */คลาสสาธารณะ testconpro P = ผู้ผลิตรายใหม่ (BlockingQueue); ผู้บริโภค C = ผู้บริโภคใหม่ (BlockingQueue); Thread TP = Thread (P); Thread TC = Thread New Thread (C); TP.Start (); TC.Start ();}}}
เนื่องจาก LinkedBlockingQueue เป็นคิวที่ไม่มีขอบเขตผู้ผลิตจะยังคงผลิตต่อไปวางงานที่ผลิตในคิวและผู้บริโภคจะบริโภคในคิว:
หากคุณใช้การปิดกั้นคิว arrayblockingqueue แทนคุณสามารถเริ่มต้นขนาดคิว จากนั้นเมื่อองค์ประกอบในคิวเกินขนาดคิวผู้ผลิตจะรอให้ผู้บริโภคบริโภคหนึ่งแล้วผลิตอีกอย่าง:
รหัสทดสอบ:
เริ่มต้น arrayblockingqueue ขนาด 10:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {blockingqueue blockkingqueue = ใหม่ arrayblockingqueue (10); ผู้ผลิต P = ผู้ผลิตรายใหม่ (BlockingQueue); ผู้บริโภค C = ผู้บริโภคใหม่ (BlockingQueue); Thread TP = Thread (P)ในระหว่างการทดสอบผู้ผลิตได้รับอนุญาตให้ผลิตได้เร็วขึ้นเล็กน้อยในขณะที่ผู้บริโภคช้าลง คุณจะเห็นว่าความแตกต่างระหว่างหมายเลขซีเรียลผลิตภัณฑ์ที่ผลิตและหมายเลขซีเรียลผลิตภัณฑ์ที่ใช้คือ 10 เสมอ (ขนาดของคิว):
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับวิธีการใช้งานของแบบจำลองผู้บริโภคการผลิตและตัวอย่างรหัสของปัญหาความปลอดภัยของเธรด ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!