说明:该程序是本人在看:Java程序设计标准教程 一书上的程序案例,由于此前上操作系统课程要求写生产者与消费者的实验(以前不会写),所以一看见这个案例立马就敲了一遍源代码,放在这共享,留着理解多线程这部分的知识用。
package com.thread;
/**
* @生产者与消费者的问题
*/
public class ProductTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Repertory repertory=new Repertory(); //仓库
new Thread(new Producer(repertory)).start(); //生产者线程
new Thread(new Consumer(repertory)).start(); //消费者线程
}
}
//仓库
class Repertory{
//默认0个产品
private int product = 0;
//生产者生产出来的产品放置到仓库中
public synchronized void addProduct(){
if(this.product >= 5){
try {
System.out.println("---产品已满,请稍后再生产---");
this.wait();//产品已满,请稍后再生产
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
product++;
System.out.println("生产者生产第"+product+"个产品");
System.out.println("---通知等待区的消费者可以取产品了---");
this.notifyAll(); //通知等待区的消费者可以取产品了
}
}
//消费者从仓库中取产品
public synchronized void getProduct(){
if(this.product <= 0){
try {
System.out.println("---缺货,请稍候再取---");
this.wait();//缺货,请稍候再取
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("消费者取走了第"+product+"个产品");
product--;
System.out.println("---通知等待区的生产者可以生产产品了---");
this.notifyAll(); //通知等待区的生产者可以生产产品了
}
}
}
//生产者线程要执行的任务
class Producer implements Runnable{
private Repertory repertory;
public Producer(Repertory repertory){
this.repertory=repertory;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("生产者开始生产产品");
while(true){
try {
Thread.sleep((int)(Math.random()*10)*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repertory.addProduct(); //生产产品
}
}
}
//消费者线程要执行的任务
class Consumer implements Runnable{
private Repertory repertory;
public Consumer(Repertory repertory){
this.repertory=repertory;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("消费者开始取走产品");
while(true){
try {
Thread.sleep((int)(Math.random()*10)*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
repertory.getProduct();
}
}
}
------------------程序结果(程序是死循环,所以下面是程序运行一段时间后终止程序获取的结果)------------------------------
生产者开始生产产品
消费者开始取走产品
---缺货,请稍候再取---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
生产者生产第3个产品
---通知等待区的消费者可以取产品了---
消费者取走了第3个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第2个产品
---通知等待区的生产者可以生产产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
消费者取走了第2个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第1个产品
---通知等待区的生产者可以生产产品了---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
消费者取走了第1个产品
---通知等待区的生产者可以生产产品了---
生产者生产第1个产品
---通知等待区的消费者可以取产品了---
生产者生产第2个产品
---通知等待区的消费者可以取产品了---
生产者生产第3个产品
---通知等待区的消费者可以取产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
---产品已满,请稍后再生产---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
生产者生产第5个产品
---通知等待区的消费者可以取产品了---
消费者取走了第5个产品
---通知等待区的生产者可以生产产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品
---通知等待区的生产者可以生产产品了---
生产者生产第4个产品
---通知等待区的消费者可以取产品了---
消费者取走了第4个产品