首页 > 编程语言 >Java基础 等待唤醒机制(阻塞队列方式实现)

Java基础 等待唤醒机制(阻塞队列方式实现)

时间:2023-10-28 15:44:18浏览次数:35  
标签:Java 队列 阻塞 queue Cook ArrayBlockingQueue 唤醒 public

等待唤醒机制还可以用 阻塞队列的方式进行实现

 

 

 

 

练习:利用阻塞队列完成生产者和消费者(等待唤醒机制)的代码

细节:生产者和消费者必须使用同一个阻塞队列

阻塞队列的创建方式(泛型:队列里面数据的类型):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

相关文章

  • Java基础 什么是生产者和消费者
    在Java中,"生产者-消费者"(Producer-Consumer)是一种常见的并发编程模型,用于协调多个线程之间的工作,其中一些线程充当生产者,而其他线程充当消费者。这模型通常用于处理共享数据的情况,其中生产者线程生成数据并将其放入共享缓冲区,而消费者线程则从缓冲区中取出数据并进行处理。主要特......
  • Java基础 Java 为什么非要在 锁对象身上调用 wait()方法 和 notifyAll()方法
    在Java中,wait()和notify()方法必须在同步块或同步方法内部使用,通常在锁对象上调用,有以下原因:1.互斥性:当你在同步块内部使用wait()和notify()方法时,它们与锁对象紧密相关,确保在调用wait()和notify()时能够维持互斥性。这意味着在调用wait()时,当前线程会释放锁,而在调用notify()时,......
  • 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表
    一、链表结构1.单向链表节点结构publicclassNode{ publicintvalue;publicNodenext;publicNode(intdata){value=data;}}2.双向链表节点结构publicclassDoubleNode{publicintvalue;publicDoubleNodelast;publicDouble......
  • Java基础 等待唤醒机制——生产者代码实现
    packagepojo.xc01;publicclassCookextendsThread{@Overridepublicvoidrun(){while(true){synchronized(Desk.lock){if(Desk.count==0)break;if(Desk.foodFlog==1){//桌子上有食物,就等待......
  • Java基础 等待唤醒机制——消费者代码实现
    等待唤醒机制的三个角色:生产者、消费者、控制生产者和消费者的第三者代码:packagepojo.xc01;//用来控制生产者和消费者的执行publicclassDesk{//桌子上是否有面条(0:没有面条1:有面条)//用布尔类型表示的话有一个小弊端,因为布尔类型只有两个值,只能控制两条线程轮流执行......
  • javaweb--事务
    beginupdate.........commit事务的四大特征A原子性--要么都成功要么都失败C一致性--事务完成时必须所有数据都保持一致状态I隔离性--多个事务之见操作的可见性D持久性--事务一旦提交或会滚,对数据库中数据的改变是永久的查看事务默认自动提交select@@autocommit;1->自......
  • Java8新特性
    Stream流可以说是Java8新特性中用起来最爽的一个功能了,有了它,从此操作集合告别繁琐的for循环。但是还有很多小伙伴对Stream流不是很了解。今天就通过本篇,一起深入了解下如何使用它。Java8Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操......
  • Javaweb常用依赖版本(未完结)
    说明因idea与jdk版本的原因,一些高版本的依赖不能使用。这里列举常用依赖,使运行无错。版本说明idea2019jdk1.8MySQL5.7.24框架版本2.7web、MySQL、mybatis等可用自带的依赖Lombok<dependency><groupId>org.projectlombok</groupId><artifa......
  • Java基础 生产者和消费者(等待唤醒机制)
      生产者和消费者完整的执行过程:  ......
  • Java基础 当某一个线程执行代码时发现锁已经被锁住了,该线程会怎么样?
    当一个线程尝试获取一个已经被其他线程锁住的锁时,它的行为取决于所使用的编程语言和锁的类型。一般情况下,有以下几种可能的行为:1.阻塞等待:线程会被阻塞,直到锁变为可用。这是最常见的情况,通常用于互斥锁。在Java中,可以使用synchronized关键字或ReentrantLock类来实现这种行为。2.......