线程的等待与唤醒,实现if...else里面的值交互依次输出
线程通信原理图:

- 资源类:
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里面的值交互依次输出的更多相关文章
- java多线程系类:基础篇:05线程的等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java并发编程之CountDownLatch,CyclicBarrier实现一组线程相互等待、唤醒
java多线程应用场景不少,有时自己编写代码又不太容易实现,好在concurrent包提供了不少实现类,还有google的guava包更是提供了一些最佳实践,这让我们在面对一些多线程的场景时,有了不少 ...
- Java线程的等待与唤醒完整示例代码
项目结构: 资源类: 输入线程: 输出线程: 测试: 人妖问题发生: 线程安全问题的解决方法: 调用Object的wait()和notify()方法时需注意:必须是锁对象方可调用,否则将抛出无效的监 ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- java 多线程—— 线程等待与唤醒
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java多线程5:线程等待与唤醒
原文:http://www.cnblogs.com/skywang12345/p/3479224.html wait(),notify(), notifyAll()等方法介绍在Object.java中 ...
- Java多线程(五)——线程等待与唤醒
一.wait().notify().notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进 ...
- linux平台,对线程等待和唤醒操作的封装(pthread_cond_timedwait 用法详解)
前言 linux平台下,线程等待和唤醒操作是很常见的,但是平台函数不易使用:笔者对此操作做了封装,使之更易于使用. 线程等待和唤醒函数比较 平台提供了线程等待相关函数,这些函数之间用法也有些差异: s ...
- java - 线程等待与唤醒
Java多线程系列--“基础篇”05之 线程等待与唤醒 概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. w ...
随机推荐
- [C++进阶] 数据结构与算法
1 出栈&入栈问题 一个栈的入栈序列为ABCDE,则不可能的出栈序列为?(不定项选择题) A:ECDBA B:DCEAB C:DECBA D:ABCDE E:EDCBA 正确答案 ...
- Keras 使用过程问题汇总
以下是Keras 使用过程出现的一些问题: (1)Keras 后端选择问题 一开始是选用的Theano,结果迭代一轮所花时间很长: 后面改用:TensorFlow作为后端,结果果然变快了: 改完Ten ...
- @AspectJ注解的value属性
@Component @Scope("prototype") @Aspect(value="perthis(execution(* com.helius.service. ...
- spring Boot 学习(八、Spring Boot与与监控管理)
一.监控管理通过引入spring-boot-starter-actuator,可以使用Spring Boot为我们提供的准 生产环境下的应用监控和管理功能.我们可以通过HTTP,JMX,SSH协议来进 ...
- C语言----选择结构(基础篇三)
大家好,忙里抽空更新一下自己的博客,算是自己的一个进步,C语言视频启蒙我早就看完啦,只是觉得这个视频真不错,所以给大家分享一下,同时自己还有很多没有理解透彻,写写博客算是一个笔记更是对自己所学的知识的 ...
- c# Windows服务管理
.NET Framework中提供的类库可以很方便的实现对windows服务的安装.卸载.启动.停止.获取运行状态等功能.这些类都在System.ServiceProcess命名空间下. 所以,在开始 ...
- Navicat 破解版(操作非常简单)
Navicat 破解版(操作非常简单) 参考这位老哥的博客,之前试过好多个,只有这个是最简单有效的 https://blog.csdn.net/WYpersist/article/details/86 ...
- 通过调试vue-cli 构建代码学习vue项目构建运行过程
我们知道vue-cli 3.0之前直接基于webpack创建对应配置文件,我们通过学习webpack就能够了解其构建过程,然而从vue-cli 3.0开始,vue-cli命令行更改为@vue/cli以 ...
- dubbo循序渐进 - 什么是RPC
RPC的核心并不在于使用什么协议.RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里.通过RPC能解耦服务,这才是使用RPC的真正目的.RPC的原理 ...
- 8.Javascript-map、reduce、filter 等高阶函数
高阶函数 高阶函数是对其他函数进行操作的函数,可以将它们作为参数或通过返回它们.简单来说,高阶函数是一个函数,它接收函数作为参数或将函数作为输出返回. 例如Array.prototype.map,Ar ...