记录一下笔面试中出现的比较简单却又带来了很大麻烦的一些题目。
题目:实现一个多生产者多消费者模型
来源:字节跳动后端开发二面
java代码实现
import java.util.ArrayList;
import java.util.List;
/**
* @Description 面试题:实现一个多生产者多消费者模型
* @Author shendongjian
* @CreateTime 2019/7/24 11:03
*/
public class ProducerCustomer {
private static final Object lock = new Object();
private static List<Integer> resources = new ArrayList<>(1);
private static int time = 0;
public static void main(String[] args){
for(int i = 0; i < 3; i++){
new Thread(()->{
while(time < 20){
if(resources.isEmpty()){
synchronized (lock){
try {
if(resources.isEmpty()){
int value = (int) (Math.random()*100);
resources.add(value);
System.out.println(Thread.currentThread().getName()+"生产了:"+value);
time++;
}else{
lock.wait();
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.notifyAll();
}
}
}
}
}).start();
new Thread(()->{
while(time < 20){
if(!resources.isEmpty()){
synchronized (lock){
try {
if(!resources.isEmpty()){
int value = resources.get(0);
resources.remove(0);
System.out.println(Thread.currentThread().getName()+"消费了:"+value);
time++;
}else{
lock.wait();
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.notifyAll();
}
}
}
}
}).start();
}
}
}
运行效果如图
代码有很大的优化和精简的空间,但是由于时间问题
(不,我是懒)在此不做深入研究