[英]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.