线程通信原理图:


  • 资源类:
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. ASP.NET Core消息队列RabbitMQ基础入门实战演练

    一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不 ...

  2. Spring JdbcTemplate使用别名传参(NamedParameterJdbcTemplate)

    原文地址http://www.voidcn.com/article/p-cwqegtpg-hx.html 在使用JdbcTemplate时,一般传参都是用的?来绑定参数,但是对于某种情况就不适用了,例 ...

  3. [转帖]kafka 如何保证数据不丢失

    kafka 如何保证数据不丢失 https://www.cnblogs.com/MrRightZhao/p/11498952.html   一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数 ...

  4. 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁

    spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...

  5. DEV 总结

    转自:https://www.cnblogs.com/yuerdongni/archive/2012/09/08/2676753.html 1. 如何解决单击记录整行选中的问题 View->Op ...

  6. (原创)MODBUS-TCP协议分析

  7. 我的探究:为什么.h头文件中不要写using namespace std

  8. 换个语言学一下 Golang (13)——Web表单处理

    介绍 表单是我们平常编写Web应用常用的工具,通过表单我们可以方便的让客户端和服务器进 行数据的交互.对于以前开发过Web的用户来说表单都非常熟悉.表单是一个包含表单元素的区域.表单元素是允许用户在表 ...

  9. [Flutter] 实现Flutter App内更新

    app内实现根据安卓和IOS平台进行更新 时间匆忙,相关操作以及信息都写在代码注释里面了,闲时在补充和完善. 功能在android项目中测试可用,ios上还未进行测试,如果ios有问题或者没问题的话都 ...

  10. vue动画理解,进入、离开、列表过度和路由切换。

    vue的动画对于很多初学者,甚至对很多老鸟来说也是很费劲,不容易控制的. 这篇文章讲vue动画的理解.其实没那么难. 动画理解 一个元素从A状态变成B状态,如果这个过程通过某种方式反应在视图上了,那么 ...