产品仓库类
@SuppressWarnings("all") | |
public class StoreHouse { | |
private int cut = 0;// 用于记录产品的数量 | |
public synchronized void produceProduct(){ | |
notify(); | |
if(cut < 10){ | |
System.out.println(Thread.currentThread().getName()+"正在生产第: ["+(cut+1)+"] 个产品"); | |
cut ++; | |
}else{ | |
System.out.println("仓库已经满了"); | |
try{ | |
wait(); | |
}catch(InterruptedException e){ | |
e.printStackTrace(); | |
} | |
} | |
} | |
public synchronized void consumerProduct(){ | |
notify(); | |
if(cut > 0){ | |
System.out.println("线程"+Thread.currentThread().getName()+"正在消费第: ["+(cut-1)+"] 个产品"); | |
cut --; | |
}else{ | |
try{ | |
wait(); | |
}catch(InterruptedException e){ | |
e.printStackTrace(); | |
} | |
} | |
} | |
} |
生产者
@SuppressWarnings("all") | |
public class ProduceThread extends Thread{ | |
// 声明一个参数类型的引用作为成员变量,为了能够调用仓库类中的生产方法,合成复用原则 | |
private StoreHouse storeHouse; | |
// 为了确保两个线程公用共一个仓库 | |
public ProduceThread (StoreHouse storeHouse){ | |
this.storeHouse = storeHouse; | |
} | |
@Override | |
public void run(){ | |
while(true){ | |
storeHouse.produceProduct(); | |
try{ | |
Thread.sleep(100); | |
}catch(InterruptedException e){ | |
e.printStackTrace(); | |
} | |
} | |
} | |
} |
消费者
@SuppressWarnings("all") | |
public class ConsumerThread extends Thread{ | |
// 声明参数类型引用作为成员变量,合成复用原则 | |
private StoreHouse storeHouse; | |
// 创建有参构造,让两个线程共同使用一个仓库 | |
public ConsumerThread (StoreHouse storeHouse) { | |
this.storeHouse = storeHouse; | |
} | |
@Override | |
public void run(){ | |
while(true){ | |
storeHouse.consumerProduct(); | |
try{ | |
Thread.sleep(1000); | |
}catch(InterruptedException e){ | |
e.printStackTrace(); | |
} | |
} | |
} | |
} |
测试类
@SuppressWarnings("all") | |
public class StoreHouseTest { | |
public static void main(String[]args){ | |
// 创建仓库类对象 | |
StoreHouse storeHouse = new StoreHouse(); | |
// 创建线程类对象并启动 | |
ProduceThread produce = new ProduceThread(storeHouse); | |
ConsumerThread consumer = new ConsumerThread(storeHouse); | |
produce.start(); | |
consumer.start(); | |
} | |
} | |
--------------------------RUN-------------------------- | |
Thread-0正在生产第: [1] 个产品 | |
线程Thread-1正在消费第: [0] 个产品 | |
Thread-0正在生产第: [1] 个产品 | |
Thread-0正在生产第: [2] 个产品 | |
Thread-0正在生产第: [3] 个产品 | |
Thread-0正在生产第: [4] 个产品 | |
Thread-0正在生产第: [5] 个产品 | |
Thread-0正在生产第: [6] 个产品 | |
Thread-0正在生产第: [7] 个产品 | |
Thread-0正在生产第: [8] 个产品 | |
Thread-0正在生产第: [9] 个产品 | |
线程Thread-1正在消费第: [8] 个产品 | |
Thread-0正在生产第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 | |
线程Thread-1正在消费第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 | |
线程Thread-1正在消费第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 | |
线程Thread-1正在消费第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 | |
线程Thread-1正在消费第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 | |
线程Thread-1正在消费第: [9] 个产品 | |
Thread-0正在生产第: [10] 个产品 | |
仓库已经满了 |