Java多线程03——等待唤醒机制(and阻塞队列实现)

news2024/11/15 4:26:08

目录

  • 1.等待唤醒机制
    • 1.ThreadDemo
    • 2.Desk
    • 3.Cook
    • 4.Foodie
  • 2.等待唤醒机制(阻塞队列方式实现)
    • 1.ThreadDemo02
    • 2.Cook02
    • 3.Foodie02
  • 3.线程的状态

1.等待唤醒机制

生产者和消费者
桌子上有食物,消费者吃,桌子上没有食物,消费者等待,唤醒生产者,生产者准备食物。生产者准备好食物,唤醒消费者,消费者开吃
在这里插入图片描述

1.ThreadDemo

package threadwaitandnotify;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class ThreadDemo {
    public static void main(String[] args) {
        //创建线程的对象
        Cook c=new Cook();
        Foodie f=new Foodie();
        c.setName("厨师");
        f.setName("吃货");
        c.start();
        f.start();
    }
}

2.Desk

作用:控制生产者和消费者的执行
是否有面条 foodFlag=0:没有 。 foodFlag=1:有

package threadwaitandnotify;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Desk {

    /*
    * 作用:控制生产者和消费者的执行
    * */
    //是否有面条 0:没有  1:有
    public static int foodFlag=0;

    //总个数
    public static int count=10;

    //锁对象
    public static Object lock=new Object();
}

3.Cook

  1. //先判断桌子上是否有面条
  2. //有面条,线程等待
  3. //没有面条,厨师开始做
  4. //修改桌子上的食物状态
    Desk.foodFlag=1;
  5. //做完之后唤醒消费者开吃
package threadwaitandnotify;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Cook extends Thread{
    @Override
    public void run() {
        while (true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else {
                    //先判断桌子上是否有面条
                    if(Desk.foodFlag==1){
                        //有面条,线程等待
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }else {
                        //没有面条,厨师开始做
                        System.out.println(Thread.currentThread().getName()+"做了一碗面条");
                        //修改桌子上的食物状态
                        Desk.foodFlag=1;
                        //吃完之后唤醒消费者开吃
                        Desk.lock.notifyAll();
                    }
                }
            }
        }
    }
}

4.Foodie

  1. //先判断桌子上是否有面条
  2. //没有面条,线程等待
  3. //有面条,吃货开始吃
  4. //吃的总数减一
    Desk.count–;
  5. //吃完之后唤醒厨师继续做
    Desk.lock.notifyAll();
  6. //修改桌子的状态
    Desk.foodFlag=0;
package threadwaitandnotify;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Foodie extends Thread{

    @Override
    public void run() {
        while (true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else {
                    //先判断桌子上是否有面条
                    if(Desk.foodFlag==0){
                        //没有,线程等待
                        try {
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        }
                    }else {
                        //有面条,开吃
                        //吃的总数减一
                        Desk.count--;
                        System.out.println(Thread.currentThread().getName()+"在吃面条,还能再吃"+Desk.count+"碗");
                        //吃完之后唤醒厨师继续做
                        Desk.lock.notifyAll();
                        //修改桌子的状态
                        Desk.foodFlag=0;
                    }
                }
            }
        }
    }
}

在这里插入图片描述

2.等待唤醒机制(阻塞队列方式实现)

1.ThreadDemo02

  1. 利用阻塞队列完成生产者和消费者等待唤醒机制的代码
  2. 生产者和消费者必须使用同一个阻塞队列
package threadwaitandnotify02;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class ThreadDemo02 {
    //等待唤醒机制(阻塞队列方式实现)
    public static void main(String[] args) {
        /*
        * 1.利用阻塞队列完成生产者和消费者等待唤醒机制的代码
        * 2.生产者和消费者必须使用同一个阻塞队列
        * */
        //创建阻塞队列
        ArrayBlockingQueue <String>queue=new ArrayBlockingQueue<>(1);
        //创建线程的对象
        Cook02 c=new Cook02(queue);
        Foodie02 f=new Foodie02(queue);
        c.start();
        f.start();
    }
}

2.Cook02

package threadwaitandnotify02;



import java.util.concurrent.ArrayBlockingQueue;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Cook02 extends Thread{
    //成员变量阻塞队列
    ArrayBlockingQueue<String> queue;
    public Cook02(ArrayBlockingQueue<String> queue){//构造方法赋值
        this.queue=queue;
    }
    @Override
    public void run() {
        while (true){
            try {
                queue.put("面包");
                System.out.println("厨师做了一个面包");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

3.Foodie02

package threadwaitandnotify02;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * @version 1.0
 * @auther Demo龙
 */
public class Foodie02 extends Thread{
    //成员变量阻塞队列
    ArrayBlockingQueue<String> queue;
    public Foodie02(ArrayBlockingQueue<String> queue){//构造方法赋值
        this.queue=queue;
    }
    @Override
    public void run() {
        while (true){
            try {
                String q=queue.take();
                System.out.println(""+q);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

在这里插入图片描述

3.线程的状态

在这里插入图片描述

没有运行状态,运行状态是Java运行start()就绪状态后交给操作系统的

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElasticSearch 索引模板 组件模板 组合模板详细使用介绍

索引模板_template 文章目录索引模板_templateTemplate 介绍索引模板Index Template参数说明创建一个索引模板 Index Template测试不存在的索引直接添加数据创建索引总结组合索引模板 Index Template 7.8版本之后引入创建基于组件模板的索引模板 Index Template创建组件模板模拟…

LeetCode103_ 103. 二叉树的锯齿形层序遍历

LeetCode103_ 103. 二叉树的锯齿形层序遍历 一、描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&…

【头歌】顺序表的基本操作

第1关&#xff1a;顺序表的插入操作任务描述本关任务&#xff1a;编写顺序表的初始化、插入、遍历三个基本操作函数。相关知识顺序表的存储结构顺序表的存储结构可以借助于高级程序设计语言中的数组来表示&#xff0c;一维数组的下标与元素在线性表中的序号相对应。线性表的顺序…

YOLOv5/v7 引入 YOLOv8 的 C2f 模块

YOLOv8 项目地址&#xff1a;https://github.com/ultralytics/ultralytics YOLOv8 Ultralytics YOLOv8 是由 Ultralytics 开发的一个前沿的 SOTA 模型。它在以前成功的 YOLO 版本基础上&#xff0c;引入了新的功能和改进&#xff0c;进一步提升了其性能和灵活性。YOLOv8 基于快…

C 指针变量 取地址符的用法 *指针变量名的用法

文章目录IntroCode图示Intro C语言中有一类特殊的变量&#xff1a;指针变量(pointer variable)&#xff0c;用于存储某个变量的内存地址的值。 要打印指针变量一般用%p格式符&#xff0c;会打印出该指针变量的值&#xff0c;即一个内存值。 Code // Created by wuyujin1997 …

【Linux】进程概念一

进程概念一 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截止目前为止&#xff0c; 我们所认识的计算机&#xff0c;都是一个个的硬件组成 输入设备&#xff1a;包括键盘&#x…

如何使用JDBC操作数据库?JDBC API的使用详细解读

文章目录1. DriverManager1.1 注册驱动1.2 获取连接2. Connection2.1 获取执行sql的对象2.2 事务管理3. Statement4. ResultSet5. PreparedStatement5.1 sql注入问题5.2 preparedStatement 原理6. 总结Java编程基础教程系列1. DriverManager DriverManager &#xff0c;驱动管…

C++模板不支持分离编译的问题

目录前言分离编译模式普通函数的分离编译(正常)模板函数的分离编译(出错)分析解决方式拓展--extern关键字extern"C"extern变量extern模板--控制实例化前言 分离编译模式 一个项目如果有多个源文件.c组成&#xff0c;每个源文件单独编译&#xff0c;形成目标文件。最…

Kubernetes:分享一个可以展示资源视图的 K8s开源 Web/桌面 客户端工具 Octant

写在前面 博文内容主要为 Octant 介绍以及 桌面/Web 端的安装教程涉及 Linux/Windows 的安装。理解不足小伙伴帮忙指正 其实当你什么都经历了&#xff0c;会发现&#xff0c;人生无论你怎么精心策划都抵不过一场命运的安排。 Octant 不是仪表板&#xff0c;Octant 是一个带有仪…

数据结构 最短路径课设(源码+实验报告+视频讲解)(不要钱、用了自取)

XIAN TECHNOLOGICAL UNIVERSITY 课程设计报告 实验课程名称 算法与数据结构 专 业&#xff1a; 班 级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a; 实验学时&#xff1a; 指导…

Linux Debian11安装QT6开发环境

从Qt5.14开始&#xff0c;官方不提供离线安装包&#xff0c;只提供源码包和在线安装器。但是清华为我们提供了快速的在线安装方式。 一.下载清华提供的在线安装器 在线安装器下载链接 二、给在线安装器文件赋予执行权限 三、配置镜像地址运行安装器 清华源&#xff1a; ./…

7.Java判断和循环+面试相关力扣算法题详解

提示&#xff1a; 文章目录前言一、顺序结构二、分支语句(1)if语句(2)switch语句*default的位置和省略:*case穿透*switch新特性*switch和if的第三种格式各自的使用场景三、循环结构1.分类2.for循环3.while循环4.for和while的对比:5.for和while循环的区别:6.练习:四、面试时的两…

【安卓】zoo for zotero WebDAV 自动论文同步笔记

前言 前言是我写这篇博客的动机&#xff0c;可以跳过直接从“准备”开始看 之前使用mendeley管理文献&#xff0c;它不仅可以同步文件&#xff0c;还跨平台&#xff08;win、安卓等&#xff09;。但是后面&#xff0c;mendeley停止了移动平台的支持&#xff0c;导致我不能用我…

JQUERY案例

电梯导航 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

一、pyhon准备工作篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. python官网 2. 检查是否安装完毕 3. pycharm官网 5. phcharm更换主题 6. 新建第一个python文件 7. pycharm字体大小设置 ​​​​​​​8. 设置快捷键 设置字体大小 ​​​​​​…

AJAX 简介

AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 AJAX 是什么&#xff1f; AJAX Asynchronous JavaScript and XML. AJAX 是一种用于创建快速动态网页的技术。 AJAX 通过在后台与服务器进行少量数据交换&#xff0c;使网页实现异步更新。这…

第三章 关系数据库标准语言SQL

第三章 关系数据库标准语言SQL 目录第三章 关系数据库标准语言SQL3.1 SQL概述3.1.1 产生与发展3.1.2 SQL的特点3.1.3 SQL的基本概念3.2 数据库实例3.3 数据定义3.3.1 模式的定义和删除3.2.2基本表的定义、删除和修改1.常见数据类型2.定义基本表3.修改基本表4.删除基本表5.模式和…

2. 返回传播计算方法|神经网络整体架构|神经元个数对结果的影响|正则化与激活函数|神经网络过拟合解决方法

文章目录返回传播计算方法神经网络整体架构&#xff08;暂时留存&#xff0c;等后面补&#xff09;神经元个数对结果的影响正则化与激活函数神经网络过拟合解决方法返回传播计算方法 实际上计算L&#xff08;损失值&#xff09;的时候并不是只是拿一组w来进行计算&#xff0c;…

用过MyBatis-Plus,我再也不想用mybatis了——MyBatis-Plus快速入门加常见注解总结,一文快速掌握MyBatis-Plus

相比与mybatis只做增强&#xff0c;不做修改 MyBatis-Plus学习笔记一&#xff0c;是什么二&#xff0c;入门案例1.建库建表2.创建spring Boot工程3.配置相关包及类4.测试三&#xff0c;基本的curd1.BaseMapper2.通用Service四.常用注解1.TableName2.TableId3TableField4.TableL…

【python】面向对象编程

文章目录一、函数大全1.1 匿名函数 lambda1.2 过滤函数 filter1.3 format1.4 try和except1.5 位置参数和关键字参数二、类与对象2.1创建对象2.2 封装的实现方式2.3 继承2.4方法重写2.5 object 类2.5.1 __str()__2.5.2 dict()2.5.3 len()2.5.4 add()2.5.5 new()init()2.6 多态的…