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 ...
随机推荐
- Android studio来开发移动App--SQA计划和系统测试规程
概述 团队分工 产品需求 团队合作 每日例会 思维导图 UML 产品代码 团队分工 成员:刘鹏芝,罗樟,王小莉,沈兴艳,徐棒,彭康明,胡广键 产品用户:王小莉 需求规约:彭康明,罗樟 UML:刘鹏芝, ...
- MySQL数据库使用时注意事项
MySQL数据库使用时注意事项 建表的角度上 1.合理安排表关系 2.尽量把固定长度的字段放在前面 3.尽量使用char 代替varchar 4.分表:水平分和垂直分 在使用sql语句的时候 1.尽量 ...
- day26-python之封装
1.动态导入模块 # module_t=__import__('m1.t') # print(module_t) # module_t = __import__('m1.t') # print(mod ...
- plsql developer中如何设置sql window显示行号
转自:https://blog.csdn.net/qq_31302091/article/details/74931828 英文版的plsql developer中,很多时候,很多功能不去用,都不知道 ...
- PS1变量设置
\d :代表日期,格式为weekday month date \H :完整的主机名 \h :主机的第一个名字 \t :显示时间为24小时格式(HH:MM:SS) \T :显示时间为12小时格式 \A ...
- orangepi自启动打开一个终端并且运行脚本
第一步: 在 /home/pi/.config 下创建一个文件夹,名称为 autostart,如果已经存在则不需要创建 第二步: 在autostart文件夹中创建桌面启动项文件,(文件名以 .desk ...
- NSLog的各种打印格式符和打印CGRect相关结构体
1.打印CG开头的数据类型,如CGRect,CGSize等方法 1.1 打印CGRect : NSLog(@"%@", NSStringFromCGRect(someCGRect) ...
- linux时间格式
date "+%Y-%m-%d %H:%M:%S" 2019-10-27 12:02:33
- [JAVASCRIPT][EXTJS]直接用JSON创建树形控件(Ext.tree.TreePanel )(转)
直接用JSON创建树形控件(Ext.tree.TreePanel ) 1.创建多个根节点的树形 2.直接使用JsonList创建树形 <!DOCTYPE HTML PUBLIC "-/ ...
- eclipse debug问题
出现上面的问题 可能是电脑了 工具栏的run >skip all Breakpoint : 解决办法 再点一次: Eclipse debug不跳转 解决办法