java线程唤醒与等待_Java线程的等待与唤醒

生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一

Thread中重要方法

void wait() 在其他线程调用此对象的notify()方法或notifyall()方法前,导致当前线程等待

void notify() 唤醒在此对象监视器上等待的单个线程后,会继续执行wait方法之后的代码

void notifyAll() 唤醒所有等待线程

void wait(long m)在毫秒结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/blocke状态

void sleep(long m)在毫秒结束之后,线程睡醒进入到Runnable/blocke状态

使用

我们自己创建线程类的子类时,不要忘了写上继承extend。再run()方法中写入线程同步的代码,在客户端调用时,直接调用start方法,默认自动调用run方法的代码。

实例

产品类

public class Product {

//属性代表该产品是否还有

boolean flag=false;

}

//生产者类

public class Producer extends Thread{

private Product pr;

//构造有参构造函数,让产品类实例的对象作为锁对象

public Producer(Product pr){

this.pr=pr;

}

@Override

public void run() {

//一直生产该商品

while (true){

//使用锁对象

synchronized (pr){

//如果该产品还存在,

if(pr.flag==true){

try {

//生产者停止生产

pr.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//否则生产者开始生产

System.out.println("生产者正在生产");

try {

//生产时间为5秒

Thread.sleep(5000);

System.out.println("请等待5秒");

} catch (InterruptedException e) {

e.printStackTrace();

}

//生产完成

pr.flag=true;

//唤醒消费者

pr.notify();

System.out.println("生产者生产完了,消费之开始使用");

}

}

}

}

//消费者类

public class Consumer extends Thread{

private Product pr;

//郑州人流医院 http://mobile.zzzzyy120.com/

public Consumer(Product pr){

this.pr=pr;

}

@Override

public void run() {

//消费者一直消费产品

while (true){

//锁对象

synchronized (pr){

//如果产品没有了

if (pr.flag==false){

try {

//则消费者进行等待

pr.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//如果产品还有,消费者使用产品

System.out.println("消费者正在使用");

//消耗完产品,改变产品属性

pr.flag=false;

//唤醒生产者,等待再次生产产品

pr.notify();

System.out.println("产品已经使用完了,生产者开始生产");

}

}

}

}

//主函数

public static void main(String[] args) {

//实例化产品

Product pr=new Product();

//实例化生产者,并运行run方法

new Producer(pr).start();

//实例化消费者,并运行run方法

new Consumer(pr).start();

}

运行结果

995f676e77291d6dae7d4c5a6fcd37d8.png

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

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

相关文章

【学习笔记】数据链路层——信道划分访问控制(FDM、TDM、STDM、WDM、CDM CDMA)

PPT截自王道考研B站教程 一. 铺垫知识 ① 传输数据使用的两种链路 星型、总线型都是广播式结构。 星型更有容错率,总线型断一个则全断。 ② 介质访问控制 定义 采取一定措施,使得两对节点之间的通信不会发生互相干扰的情况。 分类 多路复用&…

stream of java_java8新特性之强大的Stream API

Stream APIStream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数 据库查询。也可以使用Stream API来并行…

【学习笔记】数据链路层——随机访问介质访问控制(ALOHA、CSMA、CSMA/CD、CSMA/CA),截断二进制指数规避算法

文章目录小前言一. ALOHA协议纯ALOHA协议时隙ALOHA协议ALOHA对比CSMA协议定义与分类① 1-坚持CSMA② 非坚持CSMA③ p-坚持CSMA总结CSMA/CD协议传播时延对载波监听的影响确定重传时机:截断二进制指数规避算法最小帧长问题CSMA/CA协议工作原理CSMA/CD 与 CSMA/CA的对比…

pca算法介绍及java实现_PCA算法原理及实现

众所周知,PCA(principal component analysis)是一种数据降维的方式,能够有效的将高维数据转换为低维数据,进而降低模型训练所需要的计算资源。以上是比较官方的说法,下面是人话(正常人讲的话)版。pca就是一种能够有效压缩数据的方…

【学习笔记】数据链路层——轮询访问介质控制(轮询协议、令牌传递协议)

文章目录一. 轮询访问介质控制二. 轮询协议三. 令牌传递协议结束语PPT截自王道考研B站教程 一. 轮询访问介质控制 结合了前面的信道划分访问控制、随机访问MAC协议的优点: 既要不产生冲突,又要发送时占全部带宽。 二. 轮询协议 轮询开销:…

java boolean 多线程_JAVA多线程两个实用的辅助类(CountDownLatch和AtomicBoolean)

AtomicBoolean它允许一个线程等待一个线程完成任务,然后运行:A boolean value that may be updated atomically. See the java.util.concurrent.atomic package specification for description of the properties of atomic variables. An AtomicBoolean is used in…

【学习笔记】局域网基本概念和体系结构,以太网、无线局域网与PPP协议、HDLC协议

文章目录一. 局域网:特点与要素① 拓扑结构② 传输介质③ 介质访问控制方法④ 局域网的分类⑤ IEEE 802标准⑥ MAC子层和LLC子层二. 以太网① 概述② 提供无连接、不可靠的服务③ 传输介质与拓扑结构的发展④ 10BAST-T以太网⑤ 适配器与MAC地址⑥ 以太网MAC帧⑦ 高速…

java truevfs_Java-Apache Commons VFS:使用FTP

我正在尝试通过FTP使用Apache Commons VFS.在我的FTP上,具有文件和文件夹的下一个结构://test/test/in/test/in/file1.txt/test/in/file2.txt我需要连接并从/ test / in文件夹中读取所有文件(它一直在变化).码:FileSystemManager fsManager null;FileSy…

【学习笔记】数据链路层——链路层设备:物理层拓展以太网、链路层拓展以太网与冲突域和广播域

文章目录一. 冲突域与广播域① 定义与对比图② 例子二. 物理层扩展以太网三. 链路层扩展以太网① 网桥定义透明网桥源路由网桥② 以太网交换机PPT截自B站王道考研教程 本文内容导图 一. 冲突域与广播域 可以先只是简单看看定义,然后看完二、三后再回来看对比图和…

java jui 正则表达式_常规正则表达式练习

PS:join()数组转串,split()串转数组1、test():在字符串查找符合正则的内容,如果查找到返回true,反之返回false用法:正则.test(字符串)2、search():在字符串搜索符合正则的内容,找到就…

【学习笔记】网络层——概述、数据交换方式:电路交换、报文交换与分组交换(数据报与虚电路)

文章目录一. 概述二. 数据交换方式① 电路交换② 报文交换③ 分组交换④ 分组交换 && 报文交换举例对比⑤ 三种数据交换方式比较总结三. 分组交换的两种方式① 定义传输单元名词辨析② 数据报③ 虚电路④ 数据报与虚电路的对比ppt截自王道考研B站教程 太不容易了&#…

java代码中 作用_Java利用开发中代码生成工具的作用

Java利用开发中代码生成工具的作用2010-6-5文字大小:大中小近来,随着各种代码生成工具的不断涌现(如SpringSource的Spring Roo、Skyway Builder Community Edition 6.3及Blu Age的M2Spring等),人们又将留心力转移到了这些代码生成工具在企业级Java使用开…

【学习记录】网络层——IP数据报(格式与分片)

文章目录一. IP数据报格式二. IP数据报分片① 为什么要分片?② 标识、标志与片偏移③ 例题单位为nB小结PPT截自王道考研教程 tips:b是位,B是字节。 一. IP数据报格式 在本章节中,暂时不区分IP数据报与分组。 生存时间(Time To Live)&#xf…

java计算器 运算符优先级_跪求大神帮忙,怎样在java 计算器中实现,四则运算优先级;...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼代码如下,跪求大神补充import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;import javax.swing.JFrame;i…

自动驾驶学习笔记(二十二)——自动泊车算法

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 感知算法 定位算法 规划算法…

java中保留小数位_Java中保留两位小数的方法

Java中保留4位小数的方法:import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.NumberFormat;public class format {double f 111231.5585;public void m1() {BigDecimal bg new BigDecimal(f);double f1 bg.setScale(2, BigDecimal.R…

【学习笔记】 IPv4地址、NAT与子网掩码、子网划分

文章目录一. IP地址① 在例子中理解③ IP地址的分类④ 特殊IP地址⑤ 私有IP地址⑥ 各类IP的对比二. NAT三. 子网划分与子网掩码① 子网划分② 子网掩码例题1例题2③ 使用子网时路由的转发PPT截自王道考研教程 一. IP地址 可以理解成上网设备的身份证号唯一点分十进制&#xff…

java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

大家好,我是洋仔,JanusGraph图解系列文章,实时更新~图数据库文章总目录:转载文章请保留以下声明:一:存储模式留言或私信我,邀请你加入“图数据库交流”微信群!1、图内容本文以下所有…

【学习笔记】网络层——无分类编址CIDR、ARP协议、DHCP协议和ICMP协议

文章目录一. CIDR① 定义② 构成超网③ 最长前缀匹配二. ARP协议① 定义② 例题三. DHCP协议① 主机如何获取IP②DHCP协议四. ICMP协议① ICMP差错报告报文类型(5种)数据字段不发送的情况② ICMP询问报告报文类型应用一. CIDR ① 定义 在点分十进制后加…

jdbc连接mysql的配置文件_如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码)...

本篇文章给大家带来的内容是关于如何实现jdbc连接数据库并通过配置文件调用数据的方法(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。Dbutil类package com.db;import java.io.IOException;import java.io.InputStrea…