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