【Java寒假打卡】Java基础-阻塞队列
概述
常见的阻塞队列:
- ArrayBlockingQueue:底层是数组,有界
- LinkedBlockingQueue:底层是链表,无界,最大长度是int最大值
基本使用
package com.hfut.edu.test11;
import java.util.concurrent.ArrayBlockingQueue;
public class test9 {
public static void main(String[] args) throws InterruptedException {
// 创建阻塞队列的对象 容量为1 泛型String
ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<>(1);
// 存储元素
arrayBlockingQueue.put("ajsgdcfjhras");
// 取出元素
System.out.println(arrayBlockingQueue.take());
}
}
阻塞队列-实现生产者和消费者
- 生产者
package com.hfut.edu.test12;
import java.util.concurrent.ArrayBlockingQueue;
public class Cooker extends Thread{
private ArrayBlockingQueue<String> list;
public Cooker(ArrayBlockingQueue<String> list) {
this.list = list;
}
@Override
public void run() {
super.run();
while(true){
try {
list.put("汉堡");
System.out.println("厨师放了一个汉堡包");
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
- 消费者
package com.hfut.edu.test12;
import java.util.concurrent.ArrayBlockingQueue;
public class Foodie extends Thread{
private ArrayBlockingQueue<String> list;
public Foodie(ArrayBlockingQueue<String> list) {
this.list = list;
}
@Override
public void run() {
super.run();
String take = null;
while(true){
try {
take = list.take();
System.out.println("吃货从队列中获取了" + take);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
- 主方法
package com.hfut.edu.test12;
import java.util.concurrent.ArrayBlockingQueue;
public class Demo {
public static void main(String[] args) {
// 创建一个阻塞队列 容量为1
ArrayBlockingQueue<String> list = new ArrayBlockingQueue<>(1);
// 创建线程并且开启
Cooker c = new Cooker(list);
Foodie f = new Foodie(list);
c.start();
f.start();
}
}