wait notify notifyall

Java的wait方法就是使拥有当前对象(Object)的线程(Thread)放弃锁(release lock).进入睡眠状态.
notify 通知在对象(Object)上因调用wait而等待的某一进程启动.
notifyAll 通知在对象(Object)上因调用wait而等待的所有进程启动.这些进程根据优先级顺序执行.

package scjp;

class Q {
int n;
boolean valueSet=false;

public synchronized int get(){
//if valueSet == false,wait else try to got value
if(!valueSet)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Got n " + n);
valueSet=false;
notify();
return n;
}

public synchronized void put(int n){
//if valueSet == true,already have value so wait fetch,else put
if(valueSet)
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.n=n;
System.out.println("Put n " + n);
valueSet=true;
notify();
}
}

class Producer implements Runnable{
Q q=null;

Producer (Q q){
this.q=q;
(new Thread(this,"Producer")).start();
}

@Override
public void run() {
// TODO Auto-generated method stub
int i=0;
while (i<10) {
q.put(i++);
}

}
}

class Consumer implements Runnable{
Q q=null;

public Consumer(Q q) {
// TODO Auto-generated constructor stub
this.q=q;
(new Thread(this,"Consumer")).start();
}

@Override
public void run() {
// TODO Auto-generated method stub

while (q.get()<9) {}
}



}
public class DemoThread {
public static void main(String[] args) {
Q q=new Q();
new Producer(q);
new Consumer(q);
}
}



这段代码是Java2教学中的代码,今天拿来再讨论讨论:
首先两个线程启动,他们的执行占用CPU多少随机.但是这里因为加了一个锁的Boolean型变量,而控制了put与set.
首先:创建了一个对象Q,创建了一个Producer,一个Consumer,这两个对象在构造方法中启动了线程.
第一步:
对于Producer来说,会首先去调用put方法,因为valueSet是默认值是false,所以在Q的put方法不执行wait而是执行。执行完毕后设置为true.
对于Consumer来说,会首先去调用get方法,因为valueSet是默认值是false,所以该线程会wait.
第二步:
对于Producer来说,因为valueSet已经变成true,所以会wat.
对于Consumer来说,因为valueSet已经变成true,所以会执行下面的code(get value),然后设置valueSet为false.
第三步:
Producer执行put方法,因为valueSet为True
Consumer等待
依次类推,方法执行...

这里关键是加了一个共享的变量,valueSet来判是该取值get,还是put值.当然有了wait跟notify才使它成为了可以实现的。
但是不管怎样,wait是使目前控制该对象的线程wait(等待),notify是使前面在该对象上面wait的方法继续执行.
呵呵,不知道我讲明白了没有。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值