java-资源类以及等待和唤醒
来源:互联网 发布:国内贸易用什么软件 编辑:程序博客网 时间:2024/06/05 00:44
- 多线程之间需要协调工作:如果条件不满足,则等待;当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的
- wait():
等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。
调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。 - notify():
唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行) - notifyAll():
唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的 - wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。
package com.Thread.Demo2;public class ThreadTest { public static void main(String[] args) { ResourcesDemo r = new ResourcesDemo(); Input in =new Input(r); Output out = new Output(r); Thread tin = new Thread(in); Thread tout = new Thread(out); tin.start(); tout.start(); }}
package com.Thread.Demo2;/* * 定义资源类,有2个成员变量 * name,sex * 同时有两个线程,对资源中的变量操作 * */public class ResourcesDemo { public String name; public String sex; public boolean flag=false;}
package com.Thread.Demo2;/* * 输入的的线程,对资源对象Resource中的成员变量赋值 * */public class Output implements Runnable{ private ResourcesDemo r; public Output(ResourcesDemo 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(); } } }}
package com.Thread.Demo2;import javax.annotation.Resource;/* * 输入的的线程,对资源对象Resource中的成员变量赋值 * */public class Input implements Runnable{ private ResourcesDemo r; public Input(ResourcesDemo r) { this.r=r; } public void run() { int i =0; while(true) { synchronized(r) { //标记true是等待 if(r.flag) { try { r.wait(); }catch(Exception e){ } } if(i%2==0) { r.name="张三"; r.sex="男"; }else { r.name = "lisi"; r.sex = "nv"; } r.flag=true; r.notify(); } i++; } }}
阅读全文
0 0
- java-资源类以及等待和唤醒
- java等待唤醒机制
- Java 等待/唤醒机制
- java 线程等待与唤醒
- java多线程等待唤醒机制
- 线程通信和等待/唤醒
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- java多线程---等待/唤醒以及生产者消费者经典同步Lock的实现
- java再复习——线程的状态以及等待唤醒机制
- Java线程间通信-等待唤醒机制
- JAVA 线程等待唤醒,wait and notify
- java中线程的等待与唤醒
- Java---18---多线程:等待唤醒机制
- JAVA多线程 <五>等待唤醒机制
- java学习笔记--线程等待与唤醒
- JAVA基础之等待/唤醒机制
- Java多线程--线程等待与唤醒
- MacBookPro下ubuntu系统无法输入反引号和波浪号的解决方法
- MySQL更新数据
- Intel HAXM is required to run this AVD,VT-x is disabled in BIOS”问题解决
- bzoj3671[Noi2014]随机数生成器(贪心)
- VSM及SMO算法小结
- java-资源类以及等待和唤醒
- 用gdb调试程序笔记: 以段错误(Segmental fault)为例
- Linux 常用命令
- LeetCode.389 Find the Difference
- SVN解决Unable to connect to a repository at URL 禁止访问 (forbidden)
- iOS图文并排demo,图文混排,UITextView图文显示,html转NSAttributedString
- jvm调优
- jquery的each()详细介绍
- 技术分享连载(四十一)