问个关于notify、notifyAll、wait的简单例子

trycatch2004 2005-09-18 12:47:11
public synchronized String GetMsg(int Length)
{
LengthNeeded = Length;
notifyAll();////////////////
if (LengthNeeded > Content.length())
{
available = false;
while (available == false)
{
try
{
wait();/////////////
} catch (InterruptedException e) { }
}
}
...
notifyAll();////////////////
return Msg;
}

public synchronized void PutChar(int c)
{
Character d = new Character((char) c);
Content = Content.concat(d.toString());
if (LengthNeeded < Content.length())
{
available = true;
}
notifyAll();/////////////
}
上面两个成员函数里的wait和nofityAll不是针对线程的吧?是不是针对GetMsg和PutChar方法的?
(wait、notify、notifyAll除了针对线程是不是还有这种针对synchronized函数的用法?)这里
就两个函数,为何不用notify而用notifyAll?
...全文
303 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kindani 2005-09-18
  • 打赏
  • 举报
回复
上面两个成员函数里的wait和nofityAll不是针对线程的吧?
当然是针对线程的

(wait、notify、notifyAll除了针对线程是不是还有这种针对synchronized函数的用法?)


就两个函数,为何不用notify而用notifyAll?
notifyAll通知全体,效率高。推荐使用
trycatch2004 2005-09-18
  • 打赏
  • 举报
回复
我看的是http://www-128.ibm.com/developerworks/cn/java/joy-comm/index.html这里的内容,所指的notifyAll是SerialBuffer里的GetMsg里,谁给偶解释下这两个notifyAll
trycatch2004 2005-09-18
  • 打赏
  • 举报
回复
呵呵,是这样的,这是我在网上看到的一个例子,刚接触java多线程,问得有点傻^_^

看了下java线程稍微明白了点,程序里两个线程,一个是主线程,一个是创建的另一用户线程,这个用户线程调用上面的PutChar方法给Content变量赋数据,在PutChar最后用notifyAll激活可能因调用上面方法GetMsg(由于执行里面方法里wait)而阻塞的主线程。但我还是没看懂上面第一个方法GetMsg里面的两个notifyAll方法在这里什么用(程序里就GetMsg里有这个wait)?这里的两个notifyAll对调用自己的主线程激活?不懂
congliu 2005-09-18
  • 打赏
  • 举报
回复
在wait和notify的定义中,都是可以带参数的
本意是不同的程序等待不同的信号量和唤醒不同的信号量

如果楼主不加判断地notify和wait是很危险
成富 2005-09-18
  • 打赏
  • 举报
回复
notify是从wait的等待集合中随机取出一个线程来唤醒,而notifyAll则唤醒所有的线程。使用notifyAll可以保证程序的正确性,因为很有可能你的notify唤醒的不是你想要的线程。
notifyAll会损害性能的,因为不必要的线程被唤醒,然后重新进入等待状态。
treeroot 2005-09-18
  • 打赏
  • 举报
回复
问题问得有点不可思仪

62,614

社区成员

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

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