คัดลอกรหัสรหัสดังต่อไปนี้:
สภาพบรรจุภัณฑ์
นำเข้า java.util.ArrayList;
นำเข้า java.util.List;
นำเข้า java.util.concurrent.locks.Condition;
นำเข้า java.util.concurrent.locks.Lock;
นำเข้า java.util.concurrent.locks.ReentrantLock;
-
* ใช้ Lock and Condition เพื่อใช้โมเดลผู้ผลิต-ผู้บริโภค
* @ผู้เขียนจะ
-
-
ProducerConsumerDemo ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
int โปรดิวเซอร์นับ = 10;
int จำนวนผู้บริโภค = 15;
Final ProducerConsumerDemo pcd = ProducerConsumerDemo ใหม่ (5); // ขนาดบัฟเฟอร์คือ 5
เธรด [] ProducerThreads = เธรดใหม่ [producerCount];
สำหรับ (int i = 0; i <producerCount; i++) {
ProducerThreads[i] = เธรดใหม่ ("ผู้ผลิต" + (i+1)) {
@แทนที่
โมฆะสาธารณะวิ่ง () {
pcd.ผลิต();
-
-
-
เธรด [] ConsumerThreads = เธรดใหม่ [consumerCount];
สำหรับ (int j = 0; j < ConsumerCount; j ++) {
ConsumerThreads[j] = เธรดใหม่ ("ผู้บริโภค" + (j+1)) {
@แทนที่
โมฆะสาธารณะวิ่ง () {
pcd.กิน();
-
-
-
//เริ่มเธรดผู้บริโภคของผู้ผลิต
สำหรับ (int i = 0; i <producerCount; i++) {
โปรดิวเซอร์เธรด [i] .start ();
-
สำหรับ (int j = 0; j < ConsumerCount; j ++) {
ConsumerThreads[เจ].เริ่มต้น();
-
-
int สุดท้ายคงที่ส่วนตัว DEFAULT_BUFFER_SIZE = 10;
int bufferSize; // ขนาดบัฟเฟอร์
รายการส่วนตัว <วัตถุ> bufferList;
ล็อคล็อคสุดท้ายส่วนตัว = ReentrantLock ใหม่ (จริง);
เงื่อนไขสุดท้ายส่วนตัว = lock.newCondition();
ProducerConsumerDemo สาธารณะ (int bufferSize) {
this.bufferSize = ขนาดบัฟเฟอร์ > 0 ? ขนาดบัฟเฟอร์ : DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Object>(bufferSize);
-
// การผลิต
โมฆะสาธารณะผลิตผล () {
lock.lock(); // ล็อค
พยายาม {
ในขณะที่ (bufferList.size() == bufferSize) { // บัฟเฟอร์เต็ม
System.out.println("โปรดิวเซอร์รอ เธรด: " + Thread.currentThread().getName());
สภาพ รอ();
-
// การผลิต
bufferList.add(วัตถุใหม่());
System.out.println("ผู้ผลิตสร้างหนึ่งรายการ ขณะนี้มีขนาดบัฟเฟอร์: "
+ bufferList.size() + " และเธรด: " + Thread.currentThread().getName());
Condition.signalAll(); // แจ้งให้ผู้บริโภคทราบ
} จับ (InterruptedException e) {
e.printStackTrace();
} ในที่สุด {
ล็อค.ปลดล็อค();
-
-
// การบริโภค
โมฆะสาธารณะบริโภค () {
lock.lock(); // ล็อค
พยายาม {
ในขณะที่ (bufferList.isEmpty()) { // บัฟเฟอร์ว่างเปล่า
System.out.println("ผู้บริโภครอ เธรด: " + Thread.currentThread().getName());
สภาพ รอ();
-
// การบริโภค
bufferList.remove(0); // ลบอันหนึ่งออกจากส่วนหัวของรายการที่เชื่อมโยง
System.out.println("Consumer Consumer One ตอนนี้ขนาดบัฟเฟอร์: "
+ bufferList.size() + " และเธรด: " + Thread.currentThread().getName());
เงื่อนไข.signalAll();
} จับ (InterruptedException e) {
e.printStackTrace();
} ในที่สุด {
ล็อค.ปลดล็อค();
-
-
-