wait() notify()搭配synchronize的使用
2016-03-03 18:01
531 查看
一直以为自己动多线程,使用过好像就懂了原理一样,其实是按部就班的写自己不知道原理的代码而已。
一些概念:
监视器:将监视器比作一个建筑,建筑里面有个特别的房间,房间中有一些数据,这些数据在同一个时间只能被一个线程占据。当一个线程进入到离开这个房间之前可以单独享有这些数据。
进入建筑---进入监视器
进入建筑的那个房间---获得监视器
占据房间---持有监视器
离开房间---释放监视器
离开建筑---退出监视器
结合线程的状态理解这些动作,再好的描述也不能表达出来对这些东西的感觉,只可意会。
当一段代码或数据对象用synchronize修饰时,这段代码或者数据就相当于建筑立面那个特别的房间,同一个时刻只能被一个线程享有,其他想占据这个房间的线程都按照一些规则排序,等里面的线程出去,或者“休息”的状态才能得逞~
持有监视器的线程在wait()暂时退出监视器,进入等待状态,先暂时的离开,一会还会回来。
notify()后不影响代码执行,当前线程暂停或者执行完成后,等待的线程会继续持有监控器。
一个简单的栗子
一些概念:
监视器:将监视器比作一个建筑,建筑里面有个特别的房间,房间中有一些数据,这些数据在同一个时间只能被一个线程占据。当一个线程进入到离开这个房间之前可以单独享有这些数据。
进入建筑---进入监视器
进入建筑的那个房间---获得监视器
占据房间---持有监视器
离开房间---释放监视器
离开建筑---退出监视器
结合线程的状态理解这些动作,再好的描述也不能表达出来对这些东西的感觉,只可意会。
当一段代码或数据对象用synchronize修饰时,这段代码或者数据就相当于建筑立面那个特别的房间,同一个时刻只能被一个线程享有,其他想占据这个房间的线程都按照一些规则排序,等里面的线程出去,或者“休息”的状态才能得逞~
持有监视器的线程在wait()暂时退出监视器,进入等待状态,先暂时的离开,一会还会回来。
notify()后不影响代码执行,当前线程暂停或者执行完成后,等待的线程会继续持有监控器。
一个简单的栗子
package studythread; public class WaitAndNotify { class TestWait extends Thread{ public void run(){ test("wait线程" ); } } class TestNotify extends Thread{ public void run(){ test("notify线程"); } } public void exe(){ TestWait tw = new TestWait(); tw.start(); TestNotify tn = new TestNotify(); tn.start(); } //监视器 public synchronized void test(String str){ for(int i=0 ; i<10 ; i++){ if(i == 5){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else{ notify(); } System.out.println(str +"-------------"+ i); } } public static void main(String[] args) { new WaitAndNotify().exe(); } }
相关文章推荐
- 【Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools】
- Could not instantiate class named IBNSLayoutConstraint
- Leetcode217. Contains Duplicate
- AP核MAILBOX地址的初始化和启动过程(基于ARM64 的 APCI Parking protocol)
- 线程 WebContainer 已保持活动状态 N 毫秒,此线程可能已挂起
- retain和copy还有assign的区别,atomic和nonatomic的用途
- # _http_outgoing JS的错误: The header content contains invalid characters
- AIR客户端-高效处理图片缩略图的解决思路1
- VR开发中性能问题—OculusWaitForGPU
- VR开发中性能问题—OculusWaitForGPU
- 1090. Highest Price in Supply Chain (25)
- codeforces 627B B. Factory Repairs(线段树)
- data Mining with Weka: Trailer More Data Mining with Weka 用weka 进行数据挖掘 Weka 用weka 进行更多数据挖掘
- 永远不要在循环之外调用wait方法
- 永远不要在循环之外调用wait方法
- DLL中dllmain重定义的解决办法
- Fatal: the Postfix mail system is already running 的解决方案
- List对于自定义类型,使用contains
- Email 下载音频附件完成后播放不显示名称
- wait_event_interruptible 使用方法