线程通信原理图:


  • 资源类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Resource {
String name;
String sex;
// 用于表示赋值后的成员变量值有没有被输出 或 赋值成功
boolean flag = false;
}
  • 成员变量赋值类:
package com.yonyou.sci.gateway.exec.threadnet;

public class Input implements Runnable {

    private Resource r;

    public Input (Resource r) {
this.r = r;
} @Override
public void run () {
int i = 0;
while (true) {
synchronized (r) {
// 如果 flag 为 true 说明变量 name、sex 已经成功赋值,还没有被输出
if (r.flag) {
try {
r.wait();
}catch (Exception e){};
}
else {
if (i%2 == 0) {
r.name = "张三";
r.sex = "男";
}
else {
r.name = "xiaohong";
r.sex = "girl";
}
// 给变量 name、sex 赋值完成后,把 falg 标识更改为true
r.flag = true;
i++;
// 唤醒线程
r.notify();
}
}
}
} }
  • 打印成员变量值:
package com.yonyou.sci.gateway.exec.threadnet;

public class Output implements Runnable {
private Resource r; public Output (Resource r) {
this.r = r;
} @Override
public void run () {
while (true){
synchronized (r){
// 如果 flag 为 false 说明变量 name、sex 没有被赋值,等待变量赋值
if (!r.flag) {
try{
r.wait();
}catch (Exception e){
e.getMessage();
};
}
else {
System.out.println(r.name+"........"+r.sex);
r.flag = false;
r.notify();
}
}
} }
}
  • 启动线程类:
package com.yonyou.sci.gateway.exec.threadnet;

public class mainResource {
public static void main(String[] args) {
Resource r = new Resource(); Input i = new Input(r);
Output o = new Output(r); Thread t1 = new Thread(i);
Thread t2 = new Thread(o); t1.start();t2.start(); }
}

线程的等待与唤醒,实现if...else里面的值交互依次输出的更多相关文章

  1. java多线程系类:基础篇:05线程的等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  2. Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒

    java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...

  3. Java线程的等待与唤醒完整示例代码

    项目结构: 资源类: 输入线程:  输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...

  4. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  5. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  6. Java多线程5:线程等待与唤醒

    原文:http://www.cnblogs.com/skywang12345/p/3479224.html wait(),notify(), notifyAll()等方法介绍在Object.java中 ...

  7. Java多线程(五)——线程等待与唤醒

    一.wait().notify().notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进 ...

  8. linux平台,对线程等待和唤醒操作的封装(pthread_cond_timedwait 用法详解)

    前言 linux平台下,线程等待和唤醒操作是很常见的,但是平台函数不易使用:笔者对此操作做了封装,使之更易于使用. 线程等待和唤醒函数比较 平台提供了线程等待相关函数,这些函数之间用法也有些差异: s ...

  9. java - 线程等待与唤醒

    Java多线程系列--“基础篇”05之 线程等待与唤醒 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. w ...

随机推荐

  1. [C++进阶] 数据结构与算法

    1 出栈&入栈问题 一个栈的入栈序列为ABCDE,则不可能的出栈序列为?(不定项选择题) A:ECDBA  B:DCEAB   C:DECBA   D:ABCDE   E:EDCBA 正确答案 ...

  2. Keras 使用过程问题汇总

    以下是Keras 使用过程出现的一些问题: (1)Keras 后端选择问题 一开始是选用的Theano,结果迭代一轮所花时间很长: 后面改用:TensorFlow作为后端,结果果然变快了: 改完Ten ...

  3. @AspectJ注解的value属性

    @Component @Scope("prototype") @Aspect(value="perthis(execution(* com.helius.service. ...

  4. spring Boot 学习(八、Spring Boot与与监控管理)

    一.监控管理通过引入spring-boot-starter-actuator,可以使用Spring Boot为我们提供的准 生产环境下的应用监控和管理功能.我们可以通过HTTP,JMX,SSH协议来进 ...

  5. C语言----选择结构(基础篇三)

    大家好,忙里抽空更新一下自己的博客,算是自己的一个进步,C语言视频启蒙我早就看完啦,只是觉得这个视频真不错,所以给大家分享一下,同时自己还有很多没有理解透彻,写写博客算是一个笔记更是对自己所学的知识的 ...

  6. c# Windows服务管理

    .NET Framework中提供的类库可以很方便的实现对windows服务的安装.卸载.启动.停止.获取运行状态等功能.这些类都在System.ServiceProcess命名空间下. 所以,在开始 ...

  7. Navicat 破解版(操作非常简单)

    Navicat 破解版(操作非常简单) 参考这位老哥的博客,之前试过好多个,只有这个是最简单有效的 https://blog.csdn.net/WYpersist/article/details/86 ...

  8. 通过调试vue-cli 构建代码学习vue项目构建运行过程

    我们知道vue-cli 3.0之前直接基于webpack创建对应配置文件,我们通过学习webpack就能够了解其构建过程,然而从vue-cli 3.0开始,vue-cli命令行更改为@vue/cli以 ...

  9. dubbo循序渐进 - 什么是RPC

    RPC的核心并不在于使用什么协议.RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里.通过RPC能解耦服务,这才是使用RPC的真正目的.RPC的原理 ...

  10. 8.Javascript-map、reduce、filter 等高阶函数

    高阶函数 高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们.简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回. 例如Array.prototype.map,Ar ...