多线程学习之生产者与消费者

感悟:   生产者和消费者其实就是一个很简单的一个多线程同步的例子,但是我却花了好多天才能理解。反思下来就是缺乏实践,这听起来感觉很简单的一个道理,但是能做到可就很难了。当初在看这个生产者和消费者实例的时候,看着感觉代码能简单,大致上能理解,但是到了转天自己却又写不出来了,才知道是自己还没有理解透彻。现在动了一次手实践一番以后,不说理解透彻,理解个90%还是没问题的。

基础准备: notify()是Object类的一个方法,其作用在java-api中说到,唤醒在此对象监视器上等待的单个线程,之前一直理解为哪个线程调用的该方法就唤醒哪个线程,这就大错特错了。

代码实现:

这里模拟的是生产者生产苹果,放在公共的盒子上,消费者从公共的盘子上获取水果。

先写个公共盘子类PublicBox:

package ThreadProducerAndConsumer;

/**
 * 公共的盒子
 * Created by Curtain on 2018/9/24.
 */
public class PublicBox {
    private int apple = 0;

    //增加苹果的方法
    public synchronized void increace(){
        while (apple == 5){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        apple++;
        System.out.println("生成苹果成功!");
        notify();
    }

    public synchronized void decreace(){
        while (apple == 0){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        apple--;
        System.out.println("消费苹果成功!");
        notify();
    }
}

写个生产者类Producer:

package ThreadProducerAndConsumer;

/**
 * 生产者(定义10次)
 * Created by Curtain on 2018/9/24.
 */
public class Producer implements Runnable{
    private PublicBox box;

    public Producer(PublicBox box){
        this.box = box;
    }
    @Override
    public void run() {

        //生产10次苹果
        for (int i = 0; i < 10; i++){
            try {
                System.out.println("pro i:" + i);
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            box.increace();
        }
    }
}

写个消费者类Consumer:

package ThreadProducerAndConsumer;

/**
 * 消费者
 * Created by Curtain on 2018/9/24.
 */
public class Consumer implements Runnable{
    private PublicBox box;

    public Consumer(PublicBox box){
        this.box = box;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++){
            System.out.println("con i:" + i);
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            box.decreace();
        }
    }
}

最后就是测试类:

package ThreadProducerAndConsumer;

/**
 * 生产和和消费者测试
 * Created by Curtain on 2018/9/24.
 */
public class Test01 {
    public static void main(String[] args) {
        PublicBox box = new PublicBox();

        Consumer con = new Consumer(box);
        Producer pro = new Producer(box);

        Thread t1 = new Thread(con);
        Thread t2 = new Thread(pro);

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

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值