zoukankan      html  css  js  c++  java
  • 多线程--生产者/消费者

    /**
    * Created by Administrator on 2017/6/26.
    * 生产者/消费者问题
    * 生产者(Producer)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
    * 店员一次只能持有固定数量的产品,如果生产者试图生产更多的产品,
    * 店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;
    * 如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
    */
    public class TestProduct {
    public static void main(String[] args) {
    Clerk clerk = new Clerk();
    Producer p1 = new Producer(clerk);
    Thread t1 = new Thread(p1);
    Thread t2 = new Thread(p1);

    Customer c1 = new Customer(clerk);
    Thread t3 = new Thread(c1);

    t1.start();
    t2.start();
    t3.start();
    }
    }

    /**
    * 生产者类
    */
    class Producer implements Runnable{
    Clerk clerk;
    public Producer(Clerk clerk){ this.clerk=clerk; }
    @Override
    public void run() {
    System.out.println("生产产品");
    while (true){
    try {
    Thread.sleep((int)(Math.random() * 1000));
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    clerk.addProduct();
    }
    }
    }

    /**
    * 消费者类
    */
    class Customer implements Runnable{
    Clerk clerk;
    public Customer(Clerk clerk){ this.clerk=clerk;}

    @Override
    public void run() {
    System.out.println("消费产品");
    while (true){
    try {
    Thread.sleep((int)(Math.random() * 1000));
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    clerk.consumeProduct();
    }
    }
    }

    /**
    * 店员类
    */
    class Clerk{
    int product;
    public synchronized void consumeProduct(){
    if(product<=0){
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }else{
    System.out.println(Thread.currentThread().getName()+":消费 "+product);
    product--;
    notifyAll();
    }
    }
    public synchronized void addProduct(){
    if(product>=20){
    try {
    wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }else{
    product++;
    System.out.println(Thread.currentThread().getName()+": 生产 "+product);
    notifyAll();
    }
    }
    }
  • 相关阅读:
    2016年回家的大概经过
    [转载][记录]shell 批量修改文件名
    Tinymce4 中Ajax多次加载时,会出现菜单在第二次进入时,显示的下拉菜单在左上角
    PHP生成HTML页面顶部出现空白部分(&#65279字符?)
    tcpdf MultiCell line break
    [转载][记录]javascript生成不重复的随机数
    [转载]PHP 字符串替换中文
    PHP 使用get_class_methods()和array_diff() 兩個相同的類中方法差集
    mysql datetime 排序
    highcharts 去掉右下角链接
  • 原文地址:https://www.cnblogs.com/wjunxia/p/7082354.html
Copyright © 2011-2022 走看看