Java编程语言在应用的时候需要我们不断的进行相关知识的学习
首先我们先要理解notify()和wait()
只有理解了这个语句才能更好的进行相关的应用
希望大家有所收获
为什么在前几天纪录线程的时候没有纪录这两个方法呢因为这两个方法本来就不属于Thread类而是属于最底层的object基础类的也就是说不光是Thread每个对象都有notify和wait的功能为什么?因为他们是用来操纵锁的而每个对象都有锁锁是每个对象的基础既然锁是基础的那么操纵锁的方法当然也是最基础了
按照Think in Java中的解释:wait()允许我们将线程置入睡眠状态同时又积极地等待条件发生改变而且只有在一个notify()或notifyAll()发生变化的时候线程才会被唤醒并检查条件是否有变
我们来解释一下这句话
wait()允许我们将线程置入睡眠状态也就是说wait也是让当前线程阻塞的这一点和sleep或者suspend是相同的那和sleepsuspend有什么区别呢?
区别在于(wait)同时又积极地等待条件发生改变这一点很关键sleep和suspend无法做到因为我们有时候需要通过同步(synchronized)的帮助来防止线程之间的沖突而一旦使用同步就要锁定对象也就是获取对象锁其它要使用该对象锁的线程都只能排队等着等到同步方法或者同步块里的程序全部运行完才有机会在同步方法和同步块中无论sleep()还是suspend()都不可能自己被调用的时候解除锁定他们都霸占着正在使用的对象锁不放
而wait却可以它可以让同步方法或者同步块暂时放弃对象锁而将它暂时让给其它需要对象锁的人(这里应该是程序块或线程)用这意味着可在执行wait()期间调用线程对象中的其他同步方法!在其它情况下(sleep啊suspend啊)这是不可能的
但是注意我前面说的在Java编程语言中只是暂时放弃对象锁暂时给其它线程使用我wait所在的线程还是要把这个对象锁收回来的呀wait什么?就是wait别人用完了还给我啊!好那怎么把对象锁收回来呢?
第一种方法限定借出去的时间在wait()中设置参数比如wait()以毫秒为单位就表明我只借出去秒中一秒钟之后我自动收回
第二种方法让借出去的人通知我他用完了要还给我了这时我马上就收回来哎假如我设了小时之后收回别人只用了半小时就完了那怎么办呢?靠!当然用完了就收回了还管我设的是多长时间啊
那么别人怎么通知我呢?相信大家都可以想到了notify()这就是最后一句话而且只有在一个notify()或notifyAll()发生变化的时候线程才会被唤醒的意思了
因此我们可将一个wait()和notify()置入任何同步方法或同步块内部无论在那个类里是否准备进行涉及线程的处理而且实际上我们也只能在同步方法或者同步块里面调用wait()和notify()这个时候我们来解释上面的程序简直是易如反掌了
synchronized(b){}在Java编程语言中的意思是定义一个同步块使用b作为资源锁bwait();的意思是临时释放锁并阻塞当前线程好让其他使用同一把锁的线程有机会执行在这里要用同一把锁的就是b线程本身这个线程在执行到一定地方后用notify()通知wait的线程锁已经用完待notify()所在的同步块运行完之后wait所在的线程就可以继续执行