• wait() notify()搭配synchronize的使用


    一直以为自己动多线程,使用过好像就懂了原理一样,其实是按部就班的写自己不知道原理的代码而已。

    一些概念:

    监视器:将监视器比作一个建筑,建筑里面有个特别的房间,房间中有一些数据,这些数据在同一个时间只能被一个线程占据。当一个线程进入到离开这个房间之前可以单独享有这些数据。

    进入建筑---进入监视器

    进入建筑的那个房间---获得监视器

    占据房间---持有监视器

    离开房间---释放监视器

    离开建筑---退出监视器

    结合线程的状态理解这些动作,再好的描述也不能表达出来对这些东西的感觉,只可意会。

    当一段代码或数据对象用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();
    	}
    }
    
  • 相关阅读:
    grep命令详解
    Git命令详解(一)-个人使用
    android intent和intent action大全
    android 监控EditText的变化
    第86章、系统服务之TELEPHONY_SERVICE(从零开始学Android)
    android中getSystemService详解
    关于android各种双卡手机获取imei,imsi的处置(mtk,展讯,高通等)
    Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题
    Android 移动缩放的ImageView
    Android 读写SD卡的文件
  • 原文地址:https://www.cnblogs.com/dfdi33/p/5239602.html
Copyright © 2020-2023  润新知