java中能实现生产者和消费者的方式有好几种,在初级面试中,大多数都是使用java中的wait() / notify()方法来实现的。
实现思路:
比如我们现在有一个生产衣服的工厂(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插入快并且它可以当队列使用
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!