代码见下 运行结果:
仓库已空,正等待生产...
生产者 生产了 1
生产者 生产了 2
生产者 生产了 3
生产者 生产了 10
仓库已满,正等待消费...
消费者 消费了 1
消费者 消费了 2
消费者 消费了 3
消费者 消费了 10总是生产满了才消费 什么原因?
class Product {
private int productId = 0;
public Product(int productId) {
this.productId = productId;
}
public int getProductId() {
return productId;
}
public String toString() {
return Integer.toString(productId);
}
} class StoreHouse {
private int base = 0;
private int top = 0;
// private Product[] products = new Product[10];
private LinkedList<Product> products=new LinkedList<Product>();
public synchronized void push(Product product) {
// while (top == products.length) {
while (products.size() == 10) {
notify();
try {
System.out.println("仓库已满,正等待消费...");
wait();
} catch (InterruptedException e) {
System.out.println("stop push product because other reasons"); }
}
// products[top] = product;
products.addLast(product);//add or addLast?
// top++;
}
public synchronized Product pop() {
Product pro = null;
// while (top == base) {
while (products.size() == 0) {
notify();
try {
System.out.println("仓库已空,正等待生产...");
wait();
} catch (InterruptedException e) {
System.out.println("stop push product because other reasons"); }
}
// top--;
// pro = products[top];
// products[top] = null;
pro=products.removeFirst();
return pro;
}
}class Producer implements Runnable {
private String producerName = null;
private StoreHouse storeHouse = null;
public Producer(String producerName, StoreHouse storeHouse) {
this.producerName = producerName;
this.storeHouse = storeHouse;
}
public void setProducerName(String producerName) {
this.producerName = producerName;
}
public String getProducerName() {
return producerName;
}
public void produceProduct() {
int i = 0;
while (true) {
i++;
Product pro = new Product(i);
storeHouse.push(pro);
System.out.println(getProducerName() + " 生产了 " + pro);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
return;
}
}
}
public void run() {
produceProduct();
}
}
class Consumer implements Runnable {
private String consumerName = null;
private StoreHouse storeHouse = null;
public Consumer(String consumerName, StoreHouse storeHouse) {
this.consumerName = consumerName;
this.storeHouse = storeHouse;
}
public void setConsumerName(String consumerName) {
this.consumerName = consumerName;
}
public String getConsumerName() {
return consumerName;
}
public void consumerProduct() {
while (true) {
System.out.println(getConsumerName() + " 消费了 " + storeHouse.pop());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
return;
}
}
}
public void run() {
consumerProduct();
}
}
public class TestPc {
public static void main(String[] args) {
StoreHouse storeHouse = new StoreHouse();
Producer producer = new Producer("生产者", storeHouse);
Consumer comsumer = new Consumer("消费者", storeHouse);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(comsumer);
t1.start();
t2.start();
}
}
仓库已空,正等待生产...
生产者 生产了 1
生产者 生产了 2
生产者 生产了 3
生产者 生产了 10
仓库已满,正等待消费...
消费者 消费了 1
消费者 消费了 2
消费者 消费了 3
消费者 消费了 10总是生产满了才消费 什么原因?
class Product {
private int productId = 0;
public Product(int productId) {
this.productId = productId;
}
public int getProductId() {
return productId;
}
public String toString() {
return Integer.toString(productId);
}
} class StoreHouse {
private int base = 0;
private int top = 0;
// private Product[] products = new Product[10];
private LinkedList<Product> products=new LinkedList<Product>();
public synchronized void push(Product product) {
// while (top == products.length) {
while (products.size() == 10) {
notify();
try {
System.out.println("仓库已满,正等待消费...");
wait();
} catch (InterruptedException e) {
System.out.println("stop push product because other reasons"); }
}
// products[top] = product;
products.addLast(product);//add or addLast?
// top++;
}
public synchronized Product pop() {
Product pro = null;
// while (top == base) {
while (products.size() == 0) {
notify();
try {
System.out.println("仓库已空,正等待生产...");
wait();
} catch (InterruptedException e) {
System.out.println("stop push product because other reasons"); }
}
// top--;
// pro = products[top];
// products[top] = null;
pro=products.removeFirst();
return pro;
}
}class Producer implements Runnable {
private String producerName = null;
private StoreHouse storeHouse = null;
public Producer(String producerName, StoreHouse storeHouse) {
this.producerName = producerName;
this.storeHouse = storeHouse;
}
public void setProducerName(String producerName) {
this.producerName = producerName;
}
public String getProducerName() {
return producerName;
}
public void produceProduct() {
int i = 0;
while (true) {
i++;
Product pro = new Product(i);
storeHouse.push(pro);
System.out.println(getProducerName() + " 生产了 " + pro);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
return;
}
}
}
public void run() {
produceProduct();
}
}
class Consumer implements Runnable {
private String consumerName = null;
private StoreHouse storeHouse = null;
public Consumer(String consumerName, StoreHouse storeHouse) {
this.consumerName = consumerName;
this.storeHouse = storeHouse;
}
public void setConsumerName(String consumerName) {
this.consumerName = consumerName;
}
public String getConsumerName() {
return consumerName;
}
public void consumerProduct() {
while (true) {
System.out.println(getConsumerName() + " 消费了 " + storeHouse.pop());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
return;
}
}
}
public void run() {
consumerProduct();
}
}
public class TestPc {
public static void main(String[] args) {
StoreHouse storeHouse = new StoreHouse();
Producer producer = new Producer("生产者", storeHouse);
Consumer comsumer = new Consumer("消费者", storeHouse);
Thread t1 = new Thread(producer);
Thread t2 = new Thread(comsumer);
t1.start();
t2.start();
}
}
解决方案 »
- 求一个正则表达式
- 关于TreeSet的小问题,哪位大哥能稍稍注释一下。
- 急!帮帮忙!初次写测试程序,被测试程序与测试程序之间参数传递的问题!
- 谁能给我通俗易懂的解释下预处理PreparedStatement对象的setInt(int parameterIndex, int x)
- 用java语言写的产生随机数的问题,请高手解答!
- 一个socket输出的问题,不知道是否跟线程有关
- Java中,tree的节点,能否显示两个图标?
- 请教一个问题,类似树的操作,感激万分!
- java 的包多 类也多,晕了
- 关于引入包的问题?
- 求一个二十四点问题的算法源程序
- 请求高手:在主线程启动子线程后,子线程还在运行,而主线程后已经没有语句可以执行,这时为什么主线程不退出?
将第31行放到第43行下面