各位小伙伴们大家好,在之前的文章中,小编陆陆续续讲了很多关于线程还有等待唤醒机制的一些知识,这次小编要讲的是等待唤醒机制的代码实现。

就用快递员送快递,我们取快递来举例,首先要进行需求分析。主要有两个线程,快递员线程和用户线程,一个送快递,一个拿快递。

我们首先需要定义一个快递类,代码如下:

//定义一个快递类

public class FastEmail {

String ExpressOrderNo;//快递订单号

String ExpressType;//快递类型

//有没有快递:有true,没有false,设置初始值为false

boolean flag=false;

}

//快递员类

public class Expressman extends Thread{

//1.需要在成员位置创建一个快递变量

private FastEmail fe;

//2.使用带参构造方法,为这个包子变量赋值

public Expressman(FastEmail fe) {

this.fe=fe;

}

//设置线程任务(run):送快递

public void run() {

//定义一个变量

int count=0;

while(true) {

//必须使用同步技术保证两个线程只能有一个在执行。

synchronized(fe) {

//对快递状态进行判断

if(fe.flag==true) {

//快递员调用wait方法等待

try {

fe.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//被唤醒后执行,快递员送快递

if(count%2==0) {

fe.ExpressType="中通";

fe.ExpressOrderNo="12345";

}else {

fe.ExpressType="申通";

fe.ExpressOrderNo="67890";

}

count++;

System.out.println("快递员正在配送:"+fe.ExpressType+fe.ExpressOrderNo+"快递");

//配送快递需要10s

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//修改状态为已送达

fe.flag=true;

//唤醒客户取件

fe.notify();

System.out.println("快递"+fe.ExpressType+fe.ExpressOrderNo+"已送达"+","+"请取件");

}

}}

}

//用户类是一个线程类,可以继承Thread

public class User extends Thread{

//在成员位置创建一个快递变量

private FastEmail fe;

//使用带参构造方法,为这个快递变量赋值

public User(FastEmail fe) {

this.fe=fe;

}

//设置线程任务(run):取快递

public void run() {

while(true) {

//使用同步技术保证两个线程只能有一个在执行

synchronized(fe) {

//对快递的状态进行判断

if(fe.flag==false) {

//用户进入等待状态

try {

fe.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//被唤醒之后执行的代码

System.out.println("用户取快递"+","+fe.ExpressType+fe.ExpressOrderNo);

//快递已取,修改转态为false

fe.flag=false;

//用户唤醒快递员线程,送快递

fe.notify();

System.out.println("快递已取"+","+fe.ExpressType+fe.ExpressOrderNo);

System.out.println("-----------------------------");

}}

}

}

/*测试类:

* 包含main方法,程序执行的入口,启动程序

* 创建快递对象

* 创建快递员线程,开启线程,送快递

* 创建用户线程,开启,取快递*/

public class Text {

public static void main(String[] args) {

//创建快递对象

FastEmail fe=new FastEmail();

//创建外卖员线程,开启,送外卖

new Expressman(fe).start();

new User(fe).start();

}

}

这个案例分为三个步骤,快递类,快递员类(是一个线程类,可以继承Thread),用户类与快递员类一样,也是一个线程类,最后是测试类,调用这些线程。

快递类主要是设置快递的属性,快递员类还有用户类就需要根据快递的状态来进行等待唤醒机制的操作,实现线程之间的通信有效利用快递这个资源。

大家要创建快递员线程还有用户线程时要注意:

快递员线程和用线程是通信关系Java之线程间的通信与等待唤醒机制,必须使用同步技术保证两个线程只能执行一个。锁对象必须保证唯一,可以使用快递对象作为锁对象。这样的话,快递员类和用户类就需要把快递对象作为参数传递进来。需要在成员位置创建一个快递变量,使用带参数构造方法,为这个快递变量赋值。关于等待唤醒机制的代码实现,简单一点说,等待唤醒机制其实就是线程之间的协作,比较重要的还是案例分析。小编就先说到这里,如果不懂的话,根据代码再仔细分析一下,或者结合小编之前的文章来理解。希望这篇文章可以帮到大家,也欢迎各位小伙伴补充和纠错。

图片来自网络,如有侵权,请联系作者删除

java 等待 唤醒_Java之等待唤醒机制的代码实现相关推荐

  1. java notify 唤醒_java notify()的唤醒

    在线程等待的间隙,其他的线程会进行唤醒的操作,这时候我们要用的notify()方法来进行处理.当notify()结束线程的唤醒工作,才会进行下一步的wait方法,也就是说notify()也可以结合wa ...

  2. java传递实例_Java方法的参数传递机制实例详解

    本文实例讲述了Java方法的参数传递机制.分享给大家供大家参考,具体如下: 参数传递机制 对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递. 按值传递意味着当将一个参数传递 ...

  3. java初反射_java中的反射机制

    前言: ​相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解AP ...

  4. java 内存管理_Java的内存管理机制

    今天去参加腾讯的面试,结果是一塌糊涂.把问道的问题进行整理,希望自己可以有所收获.摘取别人的文章原文 1.Java的内存管理就是对象的分配和释放 分配:内存的分配是程序完成的,程序员通过new关键字为 ...

  5. java中垃圾收集_Java中垃圾回收机制

    "猪能吃的是湿垃圾,猪不吃的是干垃圾,猪吃了会死的是有害垃圾,卖了能买猪的是干垃圾 ......"最近,上海人民都快被垃圾分类弄疯了.那作为程序员的你,知道在Java中是怎么垃圾回 ...

  6. java 反射教程_Java基础教程——反射机制

    Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...

  7. java 令牌解析_Java JWT的令牌机制

    JWT 简单介绍 全称 Json Web Token 致力于网络安全的一套Json开放标准 主要流程 将用户部分信息进行加密,生成一套令牌,存放于客户端 客户端发起请求时,带入此令牌,交由服务端识别令 ...

  8. java 验签_JAVA验签方式转换为PHP代码,求教怎么写

    sig生成方式:key:aUdqk-BvLwKltime:当前时间.(long)num:随机数.(long)SHA1(key+time+num)以java为例:privatestaticStringe ...

  9. java 静态数据_Java 静态数据初始化的示例代码

    无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...

最新文章

  1. You need to use a Theme.AppCompat theme (or descendant) with this activity解决方法
  2. arcsde服务启动不了
  3. 代码审计_strcmp比较字符串
  4. systematic approach for educational resource gathering
  5. Cocos2d-x之绘制填充矩形
  6. css规则可以放在云上,CSS中!important规则的使用方法
  7. 综述ASP.NET下的AJAX模式
  8. js将base64做UrlEncode转码
  9. addcslashes与stripcslashes
  10. linux运维常见英文报错中文翻译(菜鸟必知)
  11. AIR 文件系统概要
  12. Matlab:excel文件 转 txt文件 (只需2行代码)
  13. CTF_ CRYPTO(Cryptography)_密码学/密码编码学
  14. Cartopy绘图入门指南
  15. 计算机中c盘标准规划为什么,为什么电脑c盘老是很小的空间··定期清理了
  16. IP地址计算---子网掩码确定和子网划分等详解 (附常见相关习题)
  17. uni-app中如何引入uViewUI?
  18. 数字IC验证:Hands-on Coding之Harness Interface与内部的Interfaces
  19. 粤有料|南沙大桥正式通车,“快到飞起”的粤港澳大湾区在!路!上!
  20. 多点解读虎扑:获字节巨资加持的体育大咖,为何再次梦碎IPO?

热门文章

  1. Python 基础 — 基础语法
  2. SpringBoot - 支付宝支付之沙箱环境简单使用
  3. 使用Ewomail开源版搭建自己的邮箱服务器
  4. APP推广渠道精华十大渠道方法
  5. MCU选8位还是32位?这可不是扔钢镚的事!
  6. idea主题设置、代码特效设置
  7. root user guide_教你冻结安卓手机自带不用的APP,无需ROOT
  8. [AD域] 2008R2、2012R2微软域控AD下 转移、抢夺FSMO 5大角色
  9. VSCode官网下载很慢
  10. 大数据shipin教程_大数据完整视频