java 中多线程之间的通讯之等待唤醒机制
wait
notify ()
nitifyAll ()
都使用在同步中,因为要对持有监视器(锁)的线程操作
所以要使用在同步中,因为只有同步才具有锁
为什么这些操作线程的方法要定义object类中呢
因为这些方法在操作同步中线程时。都必须要标识他们所操作线程只有的锁
只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒
不可以对不同锁中的线程进行唤醒
也就是说,等待和唤醒必须是同一个锁
而锁可以使任意对象,所以可以被任意对象调用的方法定义object类中
class Res
{
String name;
String sex;
boolean flag = false;
} class Input implements Runnable
{
private Res r ;
Input (Res r){
this.r = r;
}
public void run (){
int x = 0;
while (true)
{
synchronized (r) {
if (r.flag)
try {r.wait();}catch(Exception e){}
if (x==0){
r.name = "java";
r.sex = "man";
}
else
{
r.name = "杰克";
r.sex = "女女vn"; }
x = (x+1)%2;
r.flag = true;
r.notify(); }
} } } class Output implements Runnable
{
private Res r;
Output (Res r){ this.r = r;
}
public void run (){
while (true){
synchronized(r){ if (!r.flag) try {r.wait();}catch (Exception e){}
System.out.println (r.name+"..."+r.sex);
r.flag = false;
r.notify(); }
} } } public class InputOutputDemo { public static void main(String[] args) {
// TODO Auto-generated method stub System.out.println ("ddddd");
Res r = new Res ();
Input input = new Input (r);
Output output = new Output (r); Thread t1 = new Thread (input);
Thread t2 = new Thread (output);
t1.start();
t2.start();
} }
在1.5之后出现了lock关键字因此使用这个关键字丰富和我们平时开发习惯
同时Condition 取代了wait notifly nitiflyAll
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; public class one { public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("ddd");
RRRRRRR res = new RRRRRRR(); Producer p1 = new Producer(res);
Producer p2 = new Producer(res); consumers c1 = new consumers(res);
consumers c2 = new consumers(res); Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(c1);
Thread t4 = new Thread(c2); t1.start();
t2.start();
t3.start();
t4.start();
} }
class RRRRRRR
{
private String name;
private int count = 1;
private boolean flag = false; private Lock lock = new ReentrantLock();
private Condition condition_pro = lock.newCondition();
private Condition condition_con = lock.newCondition();
public void set (String name) throws InterruptedException{
lock.lock();
try{
while (flag)
condition_pro.await();
this .name = name + "--" + count++;
System.out.println(Thread.currentThread().getName()+"生产商品"+this.name);
flag = true;
condition_con.signal();
}
finally{
lock.unlock();
}
} public void out()throws InterruptedException {
lock.lock();
try{
while (!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName() + "消费了" + this.name);
flag = false;
condition_pro.signal();
}
finally{
lock.unlock();
}
}
}
/*
* 生产者
*/
class Producer implements Runnable
{
private RRRRRRR res;
Producer (RRRRRRR res){ this.res = res;
}
public void run(){ try{
while (true){ res.set ("牙膏");
}
}
catch(InterruptedException e){ }
} }
/*
* 消费者
*/
class consumers implements Runnable
{ private RRRRRRR res;
consumers(RRRRRRR res){ this.res = res;
}
public void run(){
try{ while (true){
res.out();
}
}
catch(InterruptedException e){ }
}
}
java 中多线程之间的通讯之等待唤醒机制的更多相关文章
- Java 线程之间的通讯,等待唤醒机制
public class ThreadNotifySample { public static void main(String[] args) { // Res res = new Res(); / ...
- 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)
一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...
- java 中多线程之间的通讯之生产者和消费者 (多个线程之间的通讯)
在真实开发 中关于多线程的通讯的问题用到下边的例子是比较多的 不同的地方时if 和while 的区别 如果只是两个线程之间的通讯,使用if是没有问题的. 但是在多个线程之间就会有问题 /* * 这个例 ...
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒: Object类中提供了三个方法: wait():等待 notify():唤醒单个线程 notify ...
- 【java】-- 多线程之间实现通讯
1.多线程之间如何实现通讯 1.1.什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 画图演示 1.2.多线程之间通讯需求 需求:第一个线程写入(inpu ...
- java多线程中的生产者与消费者之等待唤醒机制@Version2.0
二.生产者消费者模式的学生类成员变量生产与消费demo, @Version2.0 在学生类中添加同步方法:synchronized get()消费者,synchronized set()生产者 最终版 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_1_线程状态概述
Thread中有个嵌套类 它描述了线程的状态 线程状态的图 Object类中的Wait方法和notify方法
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
随机推荐
- Android中获取选择图片与获取拍照返回结果差异
导语: 如今的安卓应用在选择图片的处理上大多合并使用拍照和从相册中选择这两种方式 今天在写一个这样的功能时遇到一个尴尬的问题,同样是拍照获取图片功能,在不同手机上运行的效果不一样,下面是在某型手机上测 ...
- 后台post get请求
/// <summary> /// 执行HTTP POST请求. /// </summary> /// <param name="url">请求 ...
- Java_正则表达式
1.简介 正则表达式是一串特定字符串,组成一个“规则字符串”,这个“规则字符串”是描述文本规则的工具.正则表达式就是记录文本规则的代码. 2.字符集合 [abc] a,b,c中任意一个字符 [^abc ...
- 看看Maple T.A.的详细作用
Maple T.A.是一个基于互联网的在线考试和智能评分系统,是Maplesoft公司 与美国数学协会(MAA)合作开发的成果,在全球拥有大量的院校用户.Maple T.A.提供了用户数据库.所见即所 ...
- Java获得键盘输入的两种方法
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
- ABP理论学习之Swagger UI集成
返回总目录 本篇目录 介绍 安装 安装Nuget包 配置 测试 介绍 从官方网站上可以看到:"启用了Swagger API,就可以获得交互式文档,生成和发现客户端SDK". 安装 ...
- eventbus 备注
Event在整个系统中是单例的. EventBus.getDefault().register(this); 注册 EventBus.getDefault().unregister(this); 注销 ...
- Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上)
Python黑帽编程 4.1 Sniffer(嗅探器)之数据捕获(上) 网络嗅探,是监听流经本机网卡数据包的一种技术,嗅探器就是利用这种技术进行数据捕获和分析的软件. 编写嗅探器,捕获数据是前置功能, ...
- 基于HttpModule的简单.NET网站授权方案
摘要 本文介绍一种入门级的网站授权(注:这里所指的授权指的是注册码效果,而不是网站登陆时的身份授权)方案,仅供学习交流及对付小白客户使用.复杂的网站授权涉及网站加密等一系列复杂的技术,不做本文介绍内容 ...
- Android N 多窗口模式,你需要知道的一切
Android N中最大.最引人注意的变化就是Mutil-window模式.对于一个开发者,我们最关心的就是:Mutil-window模式下怎么配置mutil-window模式.Activity的生命 ...