生产者和消费者

1.生产者

 public class Producer implements Runnable {
    private Clerk clerk;
   
    public Producer(Clerk clerk) {
        this.clerk = clerk;
    }
   
    public void run() {
        System.out.println(
                "生產者開始生產整數......");

        // 生產1到10的整數
        for(int product = 1; product <= 10; product++) {
            try {
                // 暫停隨機時間
                Thread.sleep((int) Math.random() * 3000);
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }
            // 將產品交給店員
            clerk.setProduct();
        }      
    }
}

2。消费者

public class Consumer implements Runnable {
    private Clerk clerk;
   
    public Consumer(Clerk clerk) {
        this.clerk = clerk;
    }
   
    public void run() {
        System.out.println(
                "消費者開始消耗整數......");

        // 消耗10個整數
        for(int i = 1; i <= 10; i++) {
            try {
                // 等待隨機時間
                Thread.sleep((int) (Math.random() * 3000));
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }

            // 從店員處取走整數
            clerk.getProduct();
        }
    }
 }

3。商店

public class Clerk {
   
    private int product = 0;
 


 
 ///
    // 這個方法由生產者呼叫
 ///
 //

    public synchronized void setProduct() {
        if(this.product>=3) {
            try {
                // 目前店員沒有空間收產品,請稍候!
                wait();
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
 
        this.product++;
        System.out.printf("现在共有商品 (%d)%n个", this.product);

        // 通知等待區中的一個消費者可以繼續工作了
        notify();
    }
   
    // 這個方法由消費者呼叫
    public synchronized int getProduct() {
        if(this.product<=0) {
            try {
                // 缺貨了,請稍候!
                wait();
            }
            catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
 
        this.product--;
        System.out.printf(
                  "现在还剩下商品 (%d)%n个", this.product);
 
        // 通知等待區中的一個生產者可以繼續工作了
        notify();
      
        return this.product;
    }
}

4。主调度

public class WaitNotifyDemo {
    public static void main(String[] args) {
        Clerk clerk = new Clerk();
 
        Thread producerThread = new Thread(
                new Producer(clerk));
        Thread consumerThread = new Thread(
                new Consumer(clerk));
 
        producerThread.start();
        consumerThread.start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值