Java 线程之间的通讯,等待唤醒机制
public class ThreadNotifySample {
public static void main(String[] args) {
// Res res = new Res();
// Input input = new Input(res);
// Output output = new Output(res);
// Thread t1 = new Thread(input);
// Thread t2 = new Thread(output);
// t1.start();
// t2.start(); /**
* 上面会出现下面的情况
* hangsan----male
* zhangsan----male
* zhangsan----male
* zhangsan----女
* 李琳----女
* 李琳----女
* 李琳----male
* 李琳----male
* 李琳----女
* */ //下面实现了线程之间的通讯,等待唤醒机制,input放进去一个数据,output取出一个数据
Res res = new Res();
Input2 i2 = new Input2(res);
Output2 o2 = new Output2(res);
Thread t3 = new Thread(i2);
Thread t4 = new Thread(o2);
t3.start();
t4.start(); /**
* 显示如下
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
*/ }
} class Res {
String userName;
String userSex;
boolean flag;
} class Input implements Runnable {
private Res res; Input(Res res) {
this.res = res;
} @Override
public void run() {
int x = 0;
while (true) {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = "李琳";
res.userSex = "女";
}
x = (x + 1) % 2;
}
}
} class Output implements Runnable {
private Res res; Output(Res res) {
this.res = res;
} @Override
public void run() {
while (true) {
System.out.println(res.userName + "----" + res.userSex);
}
}
} class Input2 implements Runnable {
private Res res; Input2(Res res) {
this.res = res;
} @Override
public void run() {
int x = 0;
while (true) {
synchronized (res) { //添加同步代码块,锁定内存中同一个对象
if (res.flag) {
try {
res.wait(); //有数据尚未被Output2取走数据则等待 Output2处理完
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = "李琳";
res.userSex = "女";
}
x = (x + 1) % 2;
res.flag = true; //有数据
res.notify(); //放完数据通知Output2来取走数据
}
}
}
}
} class Output2 implements Runnable {
private Res res; Output2(Res res) {
this.res = res;
} @Override
public void run() {
while (true) {
synchronized (res) { //添加同步代码块,锁定内存中同一个对象
if (res.flag) { //有数据待处理,则取出处理
System.out.println(res.userName + "----" + res.userSex);
res.flag = false; //无数据
res.notify(); //取完数据通知Input2继续放数据
} else {
try {
res.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
Java 线程之间的通讯,等待唤醒机制的更多相关文章
- java 22 - 17 多线程之等待唤醒机制(接16)
先来一张图,看看什么叫做等待唤醒机制 接上一章的例子. 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread( ...
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- java之等待唤醒机制(线程之间的通信)
线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同.比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- JMM之Java线程间通讯——等待通知机制及其经典范式
在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...
- 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)
一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...
- java基础(27):线程安全、线程同步、等待唤醒机制
1. 多线程 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 我们通过一个案例,演示线程 ...
- java ->多线程_线程同步、死锁、等待唤醒机制
线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. l 我们通过一个案例,演示线 ...
- Android-Java多线程通讯(生产者 消费者)&10条线程对-等待唤醒/机制的管理
上一篇博客 Android-Java多线程通讯(生产者 消费者)&等待唤醒机制 是两条线程(Thread-0 / Thread-1) 在被CPU随机切换执行: 而今天这篇博客是,在上一篇博客A ...
随机推荐
- 浅谈对BFC的认识,以及用bfc解决浮动问题
我们在前端的学习过程中常常会遇到BFC,用BFC来解决一些margin塌陷.margin合并清理浮动流的问题 那么问题来了,我们所说的BFC到底是个什么东西呢: 什么是BFC BFC(Block Fo ...
- Node笔记(新手入门必看)
. 初识Node.js 1.1 Node.js是什么 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. ...
- D1-JavaScript
下面的代码,我想要打印出hey jack,结果却打印出hey rose,为什么? function greet(person) { if (person == {name: 'jack'}) { co ...
- Go strconv模块:字符串和基本数据类型之间转换
本文转自Golove博客:http://www.cnblogs.com/golove/p/3262925.html ParseBool 将字符串转换为布尔值 // 它接受真值:1, t, T, TRU ...
- c#测量字体宽度
Bitmap image_size = * count, f.Height);//初始化大小 Graphics size_g = Graphics.FromImage(image_size); Siz ...
- 过滤器+用session验证是否登陆过
过滤器: public class MyActionFilter : ActionFilterAttribute//继承ActionFilterAttribute类 { public override ...
- ORACLE 无法访问表空间
问题描述: Oracle安装后创建用户,建表等都正常,但在插入数据的时候出现无法访问表空间 解决办法: ORACLE12权限管理比较严格需设置分配以下权限 系统权限赋值:unlimited t ...
- MongoDB/聚合/MR
管道与Aggregation: 文档结构如下: { "_id" : 1, "item" : "abc", "price" ...
- react native 手动打包jsbundle文件
1 在项目目录/android/app/src/main下建一个文件夹assets 2 react-native bundle --platform android --dev false --ent ...
- nodejs模块化标准
commonjs 导出一个 a.js function add(a, b){ return a+b; } module.exports = add; b.js const add = require( ...