page contents

面试官让我手写生产者消费者模式代码

java中能实现生产者和消费者的方式有好几种,在初级面试中,大多数都是使用java中的wait() / notify()方法来实现的。 实现思路: 当缓冲区已满时,生产者线程停止执行,放弃锁,使自己处于等...

java中能实现生产者和消费者的方式有好几种,在初级面试中,大多数都是使用java中的wait() / notify()方法来实现的。

实现思路:

  1. 当缓冲区已满时,生产者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行;
  2. 当缓冲区已空时,消费者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行。
  3. 当生产者向缓冲区放入一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态;
  4. 当消费者从缓冲区取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。

比如我们现在有一个生产衣服的工厂(ClothesFactory),现在仓库的存储能力是10件衣服。

初级面试:面试官让我手写生产者消费者模式代码

衣服工厂

生产者:

初级面试:面试官让我手写生产者消费者模式代码

生产者

消费者:

初级面试:面试官让我手写生产者消费者模式代码

消费者

执行代码:

初级面试:面试官让我手写生产者消费者模式代码

执行代码

执行结果:

初级面试:面试官让我手写生产者消费者模式代码

执行结果

我为什么选择wait和notifyAll来实现呢,因为在面试时,总有人会问你

1、为什么wait, notify 和 notifyAll这些方法不在thread类里面?

一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的(如我例子中的list,list是对象),每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

2、java中notify 和 notifyAll有什么区别?

notify()¬ifyall()的共同点:均能唤醒正在等待的线程,并且均是最后只有一个线程获取资源对象的锁。不同点:notify() 只能唤醒一个线程,而notifyall()能够唤醒所有的线程,当线程被唤醒以后所有被唤醒的线程竞争获取资源对象的锁,其中只有一个能够得到对象锁,执行代码。注意:wait()方法并不是在等待资源的锁,而是在等待被唤醒。

还有我代码中使用的是LinkedList而不是ArrayList,原因是因为LinkedList插入快并且它可以当队列使用

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章