Java生产者和消费者

/**
 * Created by wjz on 2017/3/12.
 */
public class Store {
    private final int MAX_SIZE;             //仓库的最大容量
    private int count;                      //当前的货物数量
    public Store(int n) {
        MAX_SIZE = n;
        count = 0;
    }
    //往仓库加货物的方法
    public synchronized void add() {
        while (count >= MAX_SIZE) {
            System.out.println("已经满了");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count++;
        //打印当前仓库的货物数量
        System.out.println(Thread.currentThread().toString() + "put" + count);
        this.notifyAll();
    }

    //从仓库中拿走货物的方法
    public synchronized void remove() {
        while(count <= 0) {
            System.out.println("空了");
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().toString() + "get" + count);
        count--;
        //仓库还没装满,通知生产者添加货物
        this.notify();
    }

    public static void main(String[] args) {
        Store s = new Store(5);
        Thread pro = new Producer(s);
        Thread con = new Consumer(s);
        Thread pro2 = new Producer(s);
        Thread con2 = new Consumer(s);
        pro.setName("producer");
        con.setName("consumer");
        pro2.setName("producer2");
        con2.setName("consumer2");

        pro.start();
        pro2.start();
        con.start();
        con2.start();
    }
}

class Producer extends Thread {
    private Store s;
    public Producer(Store s) {
        this.s = s;
    }

    @Override
    public void run() {
        while(true) {
            s.add();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer extends Thread {
    private Store s;
    public Consumer(Store s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            s.remove();
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
其中wait()、notify()、notifyAll()都是native方法,需要加上synchronized关键字。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值