等待唤醒机制还可以用 阻塞队列的方式进行实现
练习:利用阻塞队列完成生产者和消费者(等待唤醒机制)的代码
细节:生产者和消费者必须使用同一个阻塞队列
阻塞队列的创建方式(泛型:队列里面数据的类型):ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1) ;(1:这是一个有界的阻塞队列,创建对象的时候必须指定上限)
在测试类中创建阻塞队列的对象,有了这个阻塞队列的对象之后,我们再通过创建对象的方式 把 队列传递给Cook、Foodie,这样就可以实现 二者用的是同一个阻塞队列了
代码示例:
package pojo.xc01;
import java.util.concurrent.ArrayBlockingQueue;
public class Cook extends Thread{
ArrayBlockingQueue<String> queue;
public Cook(ArrayBlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
//不断地把面条放到阻塞队列当中
try {
queue.put("面条");//不需要写锁了,因为 put() 方法的底层有锁
System.out.println("厨师放了一碗面条");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
-----------------------------------------------------------------
package pojo.xc01;
import java.util.concurrent.ArrayBlockingQueue;
public class Foodie extends Thread{
ArrayBlockingQueue<String> queue;
public Foodie(ArrayBlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
//不断地从阻塞队列当中获取面条
try {
String food = queue.take();//不需要写锁了,因为 take() 方法的底层有锁
System.out.println(food);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
------------------------------------------------------------------------
public static void main(String[] args) throws Exception {
//创建阻塞队列的对象
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
//创建线程的对象,并把阻塞队列传递过去
Cook cook = new Cook(queue);
Foodie foodie = new Foodie(queue);
//开启线程
cook.start();
foodie.start();
}
标签:Java,队列,阻塞,queue,Cook,ArrayBlockingQueue,唤醒,public From: https://www.cnblogs.com/gagaya2/p/17794153.html