加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Java多线程总结六:经典生产者消费者问题达成

发布时间:2021-12-18 16:26:13 所属栏目:PHP教程 来源:互联网
导读:这是个线程同步的经典例子,源代码如下: package demo.thread; /** *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。 *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品 */ public cla

这是个线程同步的经典例子,源代码如下:
 
package demo.thread;  
  
/**
 *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
 *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品  
 */  
  
public class ProducersAndConsumers {  
    public static void main(String[] args) {  
        Storage storage = new Storage();  
        Thread consumer = new Thread(new Consumer(storage));  
        consumer.setName("消费者");  
        Thread producer = new Thread(new Producer(storage));  
        producer.setName("生产者");  
        consumer.start();  
        producer.start();  
    }  
}  
  
/**
 * 消费者
 */  
class Consumer implements Runnable {  
    private Storage storage;  
  
    public Consumer(Storage storage) {  
        this.storage = storage;  
    }  
  
    @Override  
    public void run() {  
        storage.pop();  
    }  
}  
  
/**
 * 生产者
 */  
class Producer implements Runnable {  
    private Storage storage;  
  
    public Producer(Storage storage) {  
        this.storage = storage;  
    }  
  
    @Override  
    public void run() {  
        Product product = new Product("090505105", "电话");  
        storage.push(product);  
    }  
  
}  
  
/**
 * 产品类
 */  
class Product {  
    private String id;// 产品id   
    private String name;// 产品名称   
  
    public Product(String id, String name) {  
        this.id = id;  
        this.name = name;  
    }  
  
    @Override  
    public String toString() {  
        return "(产品ID:" + id + " 产品名称:" + name + ")";  
    }  
  
    public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
}  
  
/**
 *仓库
 */  
class Storage {  
    // 仓库容量为10   
    private Product[] products = new Product[10];  
    private int top = 0;  
  
    // 生产者往仓库中放入产品   
    public synchronized void push(Product product) {  
        while (top == products.length) {  
            try {  
                wait();//仓库已满,等待   
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block   
                e.printStackTrace();  
            }  
        }  
        //把产品放入仓库   
        products[top++] = product;  
        System.out.println(Thread.currentThread().getName() + " 生产了产品"  
                + product);  
        notifyAll();//唤醒等待线程   
  
    }  
  
    // 消费者从仓库中取出产品   
    public synchronized Product pop() {  
        while (top == 0) {  
            try {  
                wait();//仓库空,等待   
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block   
                e.printStackTrace();  
            }  
  
        }  
  
        //从仓库中取产品   
        --top;  
        Product p = new Product(products[top].getId(), products[top].getName());  
        products[top] = null;  
        System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);  
        notifyAll();//唤醒等待线程   
        return p;  
    }  
}  
运行结果:
 
生产者 生产了产品(产品ID:090505105 产品名称:电话)
消费者 消费了产品(产品ID:090505105 产品名称:电话)
 
 

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读