昨天说好的面试题今天如约而至,相信很多小伙伴都对大厂的面试题感兴趣,那么我们来看这个问题吧
写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用
首先来读题,理解一下题目的意思,就是让我们实现一个同步的容器,两个生产者线程和10个消费者线程同时调用,就是有个锅,两个人做馒头,十个人吃馒头。大概就是这样。我写的demo中给了一个最大容量10,getCount方法因为没用到,所以就写了一个计数,大家自己写的时候可以写上去。
这里我写了两种方法来实现,先来看第一种
这里是使用了wait和notifyAll 两个方法,容器数据满了,生产者就wait,消费者把东西吃完了,就wait,这里因为我使用了notifyAll 的方法,所以有点小瑕疵,生产者或者消费者会将其他的所有线程都叫醒,虽然不会出什么问题,但是浪费资源。
再来看第二种方法
这里使用了reentrantLock ,利用了等待队列,有效的解决了demo1的问题,把生产者和消费者分别放到两个等待队列,叫醒的时候就只需要叫醒相应的等待队列就可以了,两种解法的思路是一样的,肯定还有各种各样的答案,哪位大佬有更好的写法可以评论区告诉我。
main方法是一样的
第二个题
要求用两个线程,顺序打印1A2B,一个打印数字,一个打印字母
看起来很简单,就不多做解释了
利用countDownLatch和reentrantLock,两个线程每次输出都叫醒另一个线程,然后每次把数据append到StringBuffer中。这里用StringBuffer 是因为他是线程安全的。最后一次操作不再await
学习是一个漫长的过程,希望大家都能坚持下来,回头看时会有不一样的感受