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 ...
随机推荐
- PHP 的一款http请求封装类
<?php namespace hisi; class Http { protected static $userAgent = [ 'Mozilla/5.0 (Windows NT 6.1; ...
- Node学习之(第三章:仿Apache显示目录列表的功能)
前言 今天咱们用Node.js中的核心模块以及上节学习的模板引擎art-template来实现服务器软件Apache的大体功能.用过Apache的朋友都知道,我们只需把本地文件放置在Apache的ww ...
- DDL 操作表结构
DDL 操作表结构:CRUD 一.C(create)创建 1.创建表 create table 表名( 列名1 数据类型1, 列名2 数据类型2, 列名3 数据类型3, ... 列名n 数据类型n ) ...
- C++中头文件与源文件的作用详解
一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...
- Go path/filepath文件路径操作
本文:https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter06/06.2.html path:htt ...
- Unity3D如何接入第三方的SDK - iOS篇
来源:http://blog.csdn.net/smlisi2/article/details/8786485 授人以鱼,不如授人以渔”,以UNITY3D调用iOS版的91SDK为例,利用C# / C ...
- aapt&adb笔记
aapt 查看安装包信息aapt list apk路径* aapt list xxx/app-debug.apk 查看apk文件信息并保存到本地(> 重定向符) * aapt list xx/a ...
- [nginx] nginx源码分析--监控检测模块
描述 HTTP监控检查,是nginx官网推荐使用的第三方模块 https://www.nginx.com/resources/wiki/modules/healthcheck/ https://git ...
- Python_列表操作1
1.列表相关操作:声明,添加,删除,修改,获取len colors=['红','橙','黄','绿'] #声明一个列表 def colors_getall(): #获取列表中所有元素 return c ...
- [python]赶集网二手房爬虫插件【可用任意扩展】
最近应一个老铁的要求,人家是搞房产的,所以就写了这个二手房的爬虫,因为初版,所以比较简单,有能力的老铁可用进行扩展. import requests import os from bs4 impo ...