การจำลองปัญหาคลาสสิกของผู้ผลิต-ผู้บริโภค โปรแกรมนี้จำลองกรณีที่ง่ายที่สุด - การบัฟเฟอร์เดี่ยว เพื่อจำลองสถานการณ์จริง ความล่าช้าจะถูกเพิ่มเมื่อบริโภคสินค้าและผลิตสินค้า คุณสามารถจำลองอัตราการสร้างและการบริโภคที่แตกต่างกันได้โดยการแก้ไขความล่าช้า
[รหัส]
[/ร่วม/**
* ปัญหาบัฟเฟอร์เดียวของผู้บริโภคและผู้ผลิต
* โดย xu([email protected])
-
ConsumerProducer ระดับสาธารณะ {
บัฟเฟอร์วัตถุคงที่ = null;
mutex วัตถุคงที่ = วัตถุใหม่ ();
วัตถุคงที่ condConsumer = วัตถุใหม่ ();
วัตถุคงที่ condProducer = วัตถุใหม่ ();
โมฆะคงที่สาธารณะ main (String [] args) {
ผู้ผลิตเธรด = เธรดใหม่ () {
โมฆะสาธารณะวิ่ง () {
//สำหรับ(int i=0; i<10; i++) {
สำหรับ (int i = 0; ; i ++) {
// ผลิตรายการ.
พยายาม {
เธรด.สลีป(1,000);
} จับ (InterruptedException e) {
e.printStackTrace();
-
รายการสตริง = สตริงใหม่ ("รายการ-" + i);
System.out.println("[ผู้ผลิต] ผลิต " + รายการ);
// รอให้บัฟเฟอร์ว่างเปล่า
ซิงโครไนซ์ (condProducer) {
ในขณะที่ (บัฟเฟอร์ != null) {
พยายาม {
condProducer.รอ();
} จับ (InterruptedException e) {
e.printStackTrace();
-
-
-
// นำรายการไปบัฟเฟอร์
ซิงโครไนซ์ (mutex) {
บัฟเฟอร์ = รายการ;
System.out.println("[ผู้ผลิต] ใส่ " + item + " เพื่อบัฟเฟอร์");
-
//แจ้งให้ผู้บริโภคทราบ.
ซิงโครไนซ์ (condConsumer) {
condConsumer.notify();
-
-
-
-
ผู้ใช้เธรด = เธรดใหม่ () {
โมฆะสาธารณะวิ่ง () {
//สำหรับ(int i=0; i<10; i++) {
สำหรับ( ; ; ) {
//รอของมาครับ.
ซิงโครไนซ์ (condConsumer) {
ในขณะที่ (บัฟเฟอร์ == null) {
พยายาม {
consumer.รอ();
} จับ (InterruptedException e) {
e.printStackTrace();
-
-
-
//รับไอเทมจากบัฟเฟอร์
รายการสตริง = null;
ซิงโครไนซ์ (mutex) {
รายการ = (สตริง) บัฟเฟอร์;
บัฟเฟอร์ = โมฆะ;
System.out.println(" [ผู้บริโภค] รับ " + รายการ + " จากบัฟเฟอร์");
-
//บริโภคไอเทม.
พยายาม {
เธรด.สลีป(500);
} จับ (InterruptedException e) {
e.printStackTrace();
-
System.out.println(" [ผู้บริโภค] comsumed " + รายการ);
//แจ้งผู้ผลิต.
ซิงโครไนซ์ (condProducer) {
condProducer.notify();
-
-
-
-
ผู้บริโภค.เริ่มต้น();
ผู้ผลิต.เริ่มต้น();
-
}เดอ]