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.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
随机推荐
- RunLoop(基本操作)
基本概念 -(void)runTimerInThread { //NSAutoreleasePool,没的用 [NSTimer scheduledTimerWithTimeInterval:1.0 t ...
- TP5与TP3.X对比
首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的版本.同时也强烈建议开发者抛弃之前旧的思维模式,因为5.0是一个全新的颠覆重构版本. 需要摒弃的3 ...
- 我的emacs配置
我的emacs配置文件 ;; .emacs ;; ============================== Basic Configure START ====================== ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
- PHP的日期和时间处理函数
1. 将日期和时间转变为时间戳 1.1 time() 原型:time(void) 作用:返回当前时间的 UNIX时间戳. 参数:void,可选(即无参数) 1.2 mktime() 原型:int mk ...
- perl 切换 dnspod 域名记录
提供域名,dnspod 账户密码(毕竟dns密码比较重要 不能谁 cat一下都可以看到 需要base64加密),原IP,切换目标IP, #!/bin/perl use warnings; use MI ...
- 配置apache和nginx的tomcat负载均衡
概述 本篇文章主要介绍apache和nginx的相关配置,tomcat的相关安装配置我在前面有写过一篇,详细介绍通过两种配置方法配置nginx. tomcat配置参考:http://www.cnblo ...
- SQL Azure (14) 将云端SQL Azure中的数据库备份到本地SQL Server
<Windows Azure Platform 系列文章目录> 注意: 1.只有SQL Server 2012 CU4及以上版本才支持本章内容 2.当你的数据库文件很大时,建议优化以下内容 ...
- EF:Fluent API 把一对多映射为一对一
假设有两张表:A表和B表.A表与B表在数据库中的关系是一对多,但我们需要在EF中映射为一对一. 首先在A实体类和B实体类中互相为对方增加一个实体类的属性: public A { public B B ...
- 逻辑回归(LR)总结复习
摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 最基本的LR分类器适合于对两分类(类0,类1)目标进行分类:这个模型以样 ...