线程

朗晴 2012-01-03 10:56:20
wait和notify在线程里起什么作用?
谁能帮助我,讲解一下如下线程?

class Hello
{
private String name="unknown";
private String sex="unknown";
private boolean bFull=false;
public synchronized void put(String name,String sex)
{
if(bFull)
try{wait();}catch(Exception e){}
this.name=name;
try{Thread.sleep(1);}catch(Exception e){}
this.sex=sex;
bFull=true;
notify();
}
public synchronized void get()
{
if(!bFull)
try{wait();}catch(Exception e){}
System.out.print(name);
System.out.print(":"+sex);
bFull=false;
notify();
}
}
...全文
139 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sfeng1990 2012-01-04
  • 打赏
  • 举报
回复
if(ture)等待 否则继续执行if下面的语句 if后面的语句执行完毕改变标志位 即交给另一个同步语块执行
lliiqiang 2012-01-04
  • 打赏
  • 举报
回复
两个方法分别通过wait和noify方法同步
张正 2012-01-03
  • 打赏
  • 举报
回复
仅供参考:
wait方法同步是为了可以释放调用此方法对象上的锁。notify方法调用可以随即唤醒一个由于调用了该对象wait方法的线程.
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。notify()方法和wait()方法的基本思想是给方法或代码块提供一种相互通信的方式,而这些方法或者代码块同步于某个特定对象。代码块可以调用wait()方法来将自身的操作挂起,直到同一个对象上的其他同步方法或同步代码块以某种方式将其改变,并调用notfiy()方法来通知此代码块改变已经完成。一个线程一般会因为它所同步的对象的某个属性没有设置,或者某个条件没有满足而调用wait()方法,这些由另一个线程的动作决定。最简单的情况可能是资源因为正被另一个线程修改而繁忙,还有其他的可能情况。
notify也是随机唤醒某个线程,所以不一定能唤醒到调用wait方法的那个,如果要确保能唤醒wait的方法,请用notifyAll 《引用》
Jaya1989 2012-01-03
  • 打赏
  • 举报
回复
简单的“生产者/消费者”模式,
首先两个方法都是同步的,get方法:
如果bFull为true表示还没被消费,所以进入当前对象的等待队列;
如果bFull为false表示已经被消费,则开始生产,就是你这里给name和sex设值,
设值完成后,将bFull=true,调用notify方法,通知当前对象等待队列中的一个线程
set方法与get方法相反:
如果bFull为false表示没东西可消费,所以进入当前对象的等待队列;
如果bFull为true表示有得消费,则输出name和sex,
设值bFull为false,调用notify方法,通知当前对象等待队列中的一个线程。
-----------------------------------------------------------------
wait方法:调用哪个对象的wait方法,则该线程进入这个对象的等待队列中,指到有人调用这个对象的notify或notifyAll方法。
nmyangym 2012-01-03
  • 打赏
  • 举报
回复
wait和notify在线程里起什么作用?就是起协调作用。
1 对于put方法,某个线程调用此方法,给name和sex赋值,赋值后bFull变成true.
其目的是要等别的线程(包含get方法),输出后,才能再赋值。如果没输出,则不能
  赋值。这就是 put方法被synchronized 修饰,同时里面程序加入wait()和notify()
的原因。
  同理,get 也是一样。在name和sex被赋值前不能输出,只有新赋值后才能输出。
2 模拟一下线程调用过程。
     put方法第一次调用,此时bFull是false. name和sex被赋值,bFull变成true.
notify() 通知等待的线程,(第一次没有等待的,执行也不起作用。)。
     假设程序又调用put方法,想再次赋值,如果get执行了,会让bFull变成false。
     此时,会重复开始时的情况。 而如果get没有执行,name和sex还每被输出,
     此时put程序不能给name和sex赋值,需要等待。这时程序就执行wait(). 进入
     阻塞状态,还会释放同步锁。一直要等到get()执行,把数据输出,最后
     notify()通知get(),数据取走了,可以再赋值了。
     
     而get执行的时候,一定要 name和sex先被赋值。假设刚输出了数据, name和
     sex没被赋值时,get()又执行了,此时没有数据,(bFull是false.),则程序
     也要进入wait(),还会释放同步锁,一直要等到put方法赋值后,执行notify()唤醒
     ,才会继续执行。
     这就是wait()和notify()的作用。他们一定会在synchronized 修饰的方法里或
     代码块中。
 表达的不一定清楚,如果看不明白,就看其他的帖子。
y2009270076 2012-01-03
  • 打赏
  • 举报
回复
wait()阻塞线程;
notify()唤醒被阻塞的线程;
当前线程可以调用wait()方法阻塞自己,但是不能自己唤醒自己,只能由别的线程调用notify()方法唤醒;
你所写的就是一个简单的生产者消费者问题,synchronized 修饰的方法,只能互斥访问,信号量bFull实现同步
24K純帥 2012-01-03
  • 打赏
  • 举报
回复
LZ..你这样很容易造成死锁

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧