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.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
随机推荐
- WEB前端工程师(实践)制作天气预报难度:简单
需要准备:jQuery Bootstrap 天气预报API(本文中使用API可能会失效请灵活运用) CSS样式可以你自己去写这里只提出jQuery 请求数据和解析JSON数据 { "resu ...
- 自定义 TableViewCell 的分割线
刚开始自定义 tableViewCell 的时候,用的是直接在 cell 上加一张 imageView 的方法,如果在点击 cell 的时候有页面的跳转,这样做没什么问题,但是,如果在点击 cell ...
- 搬-Android - Wi-Fi Tutorial[转]
http://www.tutorialspoint.com/android/android_wi_fi.htm Android allows applications to access to vie ...
- [转]html5表单上传控件Files API
表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...
- SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager
SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...
- ASP.NET Core 十种方式扩展你的 Views
原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...
- HTML和CSS经典布局5
如下图: 需求: 1. 如图 2. 可以从body标签开始. 3. 页面内容高度设置高点,把窗口的滚动条显示出来,但是busy indicator不滚动. <!DOCTYPE html> ...
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
- 开始用Word 2013来写博客
第一步:如果从未发布过博客文章的话,需要在菜单里面选这里添加博客账号 第二步:选择正确的设置 第三步:写完博客之后,按这里就可以发布了! 如果以后需要写新的博客的话,还可以直接点这里: ...
- 让pv3d(papervision3D)支持单帧前进、后退(nextFrame)。
下载最新的源码,找到animationController. 修改如下: package org.papervision3d.core.controller { import flash.events ...