package com.cissst.software.model;
/**
* 产品类
* @author Administrator
* @date 2015-8-10
*/
public class Product {
//产品编号
private int id;
public Product(int id) {
this.id = id;
}
public String toString() {
return "Product:" + id;
}
public int getId() {
return id;
}
}
package com.cissst.software.model;
/**
* 筐子类
* @author Administrator
* @date 2015-8-10
*/
public class Storage {
/**
* 筐子中存放6个产品
*/
private Product[] cells = new Product[6];
//当前栈顶指针
private int inPos=0;
/**
* 往筐子中放入产品
* @param product
*/
public synchronized void push(Product product){
//栈满
while(inPos == cells.length){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
cells[inPos] = product;
System.out.println(Thread.currentThread().getName()+"生产了第"+product.getId()+"个产品");
inPos ++;
this.notify();
}
/**
* 从筐子中取出产品
* @return
*/
public synchronized Product pop(){
while(inPos == 0){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
inPos --;
Product data = cells[inPos];
System.out.println(Thread.currentThread().getName()+"消费了第"+data.getId()+"个产品");
this.notify();
return data;
}
}
package com.cissst.software.Thread;
import com.cissst.software.model.Product;
import com.cissst.software.model.Storage;
public class ConsumeThread implements Runnable {
private Storage storage ;
public ConsumeThread(){
}
public ConsumeThread(Storage storage){
this.storage = storage;
}
@Override
public void run() {
for(int i=1;i<=20;i++){
Product product =storage.pop();
// System.out.println("消费了第" +product.getId()+"个产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.cissst.software.Thread;
import com.cissst.software.model.Storage;
public class MainThread {
/**
* @param args
*/
public static void main(String[] args) {
Storage storage = new Storage();
//创建生产者对象
ProduceThread produce = new ProduceThread(storage);
// //启动生产线程
// new Thread(produce).start();
//创建第一个生产者线程
Thread t1 = new Thread(produce,"生产一");
t1.start();
//创建第二个生产者线程
Thread t2 = new Thread(produce,"生产二");
t2.start();
//创建消费者对象
ConsumeThread consumeThread = new ConsumeThread(storage);
// //启动消费线程
// new Thread(consumeThread).start();
//创建第一个消费者线程
Thread c1 = new Thread(consumeThread,"消费者一");
c1.start();
//创建第二个消费者线程
Thread c2 = new Thread(consumeThread,"消费者二");
c2.start();
}
}
package com.cissst.software.Thread;
import com.cissst.software.model.Product;
import com.cissst.software.model.Storage;
/**
* 生产者线程:
* 生产20个苹果
* @author Administrator
* @date 2015-8-10
*/
public class ProduceThread implements Runnable {
private Storage storage ;
public ProduceThread(){
}
public ProduceThread(Storage storage){
this.storage = storage;
}
@Override
public void run() {
for(int i=1;i<=20;i++){
Product product = new Product(i);
storage.push(product);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}