簡體   English   中英

Java多線程中的生產者使用者

[英]Producer consumer in java multithreading

我在Java多線程中有自己的生產者和使用者實現。 但是消費者在生產者投入產品之前就獲得了產品。 如何使用等待和通知來克服這個問題。

package prod;

public class InitProCon {

volatile static int size = 5;

public static void main(String[] args) {
    Consumer con = new Consumer("Consumer Getting", size);
    Producer pro = new Producer("Producer putting", size);
    Thread producer = new Thread(pro);
    Thread consumer = new Thread(con);
    producer.start();
    consumer.start();
}
}


package prod;

public class Product {

static String product;

public void putProduct(String product) {
    Product.product = product;
}

public String getProduct() {
    return product;
}
}




package prod;

public class Consumer implements Runnable {

String cname;
int size;

Consumer(String name, int size) {
    this.cname = name;
    this.size = size;
    System.out.println(cname);
}

@Override
public void run() {
    try {
        for (int i = 0; i < size; i++) {
            Product c = new Product();
            c.getProduct();
            System.out.println("Consumer got product" + i + ""
                    + c.getProduct());
        }
    } catch (Exception e) {
        Thread.currentThread().interrupt();
    }
}
}



package prod;

public class Producer implements Runnable {

String pname;
int size;

Producer(String name, int size) {
    this.pname = name;
    this.size = size;
    System.out.println(pname);
}

@Override
public void run() {
    try {
        for (int i = 0; i < size; i++) {
            Product p = new Product();
            p.putProduct("Consumer product");
            System.out.println("Producer put" + i);
        }
    } catch (Exception e) {
        Thread.currentThread().interrupt();
    }
}
}

您沒有不同的產品內容,只有一個:

package prod;
public class Product {
    static String product;
    public void putProduct(String product) {
        Product.product = product;

注意static :所有產品( Product對象)共享相同的內容。 因此,當您的生產者生產新產品時

        Product p = new Product();
        p.putProduct("Consumer product");

您設置所有產品的內容。 因此, 似乎消費者獲得了相同的產品,但這並不完全正確。 每個消費者都有一個不同的“ Product ”類型對象,但是所有產品共享相同的內容。 通過創建新產品,您還可以更改現有產品的內容。 在輸出時,您不會注意到差異,因為您僅使用人工索引和共享內容(如果使用對象特定的值(例如“ hashCode”),則會發現它們是不同的對象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM