java thread wait的用法

liujun3512159 2009-12-25 09:47:30
大家看下
代码:

/**
* 计算输出其他线程锁计算的数据
*
* @author leizhimin 2008-9-15 13:20:38
*/
public class ThreadA {
public static void main(String[] args) {
ThreadB b = new ThreadB();
// 启动计算线程
b.start();

synchronized (b) {
try {
System.out.println("等待对象b完成计算。。。");
// 当前线程A等待
b.wait();

} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b对象计算的总和是:" + b.total);
}
}
}
/**
* 计算1+2+3 ... +100的和
*
* @author leizhimin 2008-9-15 13:20:49
*/
public class ThreadB extends Thread {
int total;

public void run() {
synchronized (this) {
for (int i = 0; i < 101; i++) {
total += i;
}

// (完成计算了)唤醒在此对象监视器上等待的单个线程,在本例中线程A被唤醒
notify();
}
}
}

大家看下蓝字部分,
这程序执行到篮字部分,表示什么意思哦?我不明白这样的用法
还有红字部分
b.wait()应该是让b线程释放执行权吧,那为什么还执行b线程中的代码哦?
...全文
3031 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhulin0504 2012-09-02
  • 打赏
  • 举报
回复
五楼正解
kelly_zsl07 2012-08-29
  • 打赏
  • 举报
回复
wait()促使当前线程放弃锁,其他等待线程可以拿到锁了
jingshuai1029 2010-12-09
  • 打赏
  • 举报
回复
兄弟你这程序有毛病呀,会出现死锁,你在 b.start()加一个 Thread.sleep(1000*2) 试试,保准会死;
rongwei84n 2010-12-06
  • 打赏
  • 举报
回复
如果B中 没有 notify() , 大家会觉得出现什么样的情况? 我试验了下,发现没有notify()也可以成功返回主线程!!!!
jiayouyubo 2009-12-29
  • 打赏
  • 举报
回复
我都看不东啊,有没简单的离子
jixin9900 2009-12-28
  • 打赏
  • 举报
回复
MARK
liujun3512159 2009-12-28
  • 打赏
  • 举报
回复
大家继续发言哦
SambaGao 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nickycheng 的回复:]
偶是这么理解的。
synchronized (b) 导致了b上开启了同步锁。也就是说
只要存在 synchronized (b) 就会等待解锁。
也就是说A里的synchronized(b) {} 就是为了防止在执行的时候 B里的synchronized (this) { } 代码段同时执行。

来个时间线。
1. A: synchronized (b) {
(这时候拿到b的锁,其他同步段不能执行,在等待中)
2.      try {
          System.out.println("等待对象b完成计算。。。");
          b.wait();
          (这时候A放弃b锁,让B执行)
3. B: synchronized (this) {
            for (int i = 0; i < 101; i++) {
                total += i;
            }
            notify();
            (唤醒A)
4. A:继续执行。
       



[/Quote]
同意
liuxuejin 2009-12-27
  • 打赏
  • 举报
回复
好明显就是让主线程等待子线程执行完了在打印结果。
System.out.println("b对象计算的总和是:" + b.total);
看到了没有!!5楼说的对,首先锁住b就是为了让主线程睡觉。b.wait(),让子线程进入b的等待队列!等子线程执行完!!才醒来!
liuxuejin 2009-12-27
  • 打赏
  • 举报
回复
不会是抄自那一本国人写的教科书吧??如果是的话 就算不用问了
xiaoxiinlose 2009-12-27
  • 打赏
  • 举报
回复
mark
huangwj20042008 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 nrgbooster 的回复:]
引用 14 楼 huangwj20042008 的回复:
蓝字部分是同步代码块
另外还可以用于方法前标示同步方法
比如:
public synchronized void methodA(){}
wait()是Object的方法,意味着所有的对象都有这个方法。
调用这个方法时表示执行这个方法的当前线程放弃执行,进入等待状态,同时放弃对象锁,其它线程就可以进入由同一个对象锁控制的同步块或同步方法。
另外,wait()一定要在同步方法或同步块中调用,关于这点,我也不知道为什么,望高手指点。


回答:为什么wait()一定要在同步方法或同步块中调用?

这是因为wait()命令的发出者必须首先拥有锁,或者说只有手中持有锁的线程才有资格等待以交出控制权。wait()/notify()这种机制的引入本身就是为了在资源独占(表现为synchronized)的前提下合作,所以只有配合锁使用才有意义。
[/Quote]
wait()/notify()是相互协作的,刚开始怎么想也想不明白要独占资源
现在想了一下,好像有点眉目了:
一个线程计算结果,另外一个线程等待结果,但是两个线程都要访问某个共同变量,一个线程往里放结果,另外一个线程从中取结果。上面的例子的total就是共同变量。因为要访问共同变量,所以涉及到资源独占的问题,所以要加上synchronized关键字。不知道这样理解是否正确?
nrgbooster 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huangwj20042008 的回复:]
蓝字部分是同步代码块
另外还可以用于方法前标示同步方法
比如:
public synchronized void methodA(){}
wait()是Object的方法,意味着所有的对象都有这个方法。
调用这个方法时表示执行这个方法的当前线程放弃执行,进入等待状态,同时放弃对象锁,其它线程就可以进入由同一个对象锁控制的同步块或同步方法。
另外,wait()一定要在同步方法或同步块中调用,关于这点,我也不知道为什么,望高手指点。
[/Quote]

回答:为什么wait()一定要在同步方法或同步块中调用?

这是因为wait()命令的发出者必须首先拥有锁,或者说只有手中持有锁的线程才有资格等待以交出控制权。wait()/notify()这种机制的引入本身就是为了在资源独占(表现为synchronized)的前提下合作,所以只有配合锁使用才有意义。
huangwj20042008 2009-12-27
  • 打赏
  • 举报
回复
蓝字部分是同步代码块
另外还可以用于方法前标示同步方法
比如:
public synchronized void methodA(){}
wait()是Object的方法,意味着所有的对象都有这个方法。
调用这个方法时表示执行这个方法的当前线程放弃执行,进入等待状态,同时放弃对象锁,其它线程就可以进入由同一个对象锁控制的同步块或同步方法。
另外,wait()一定要在同步方法或同步块中调用,关于这点,我也不知道为什么,望高手指点。
SADSDSDDASDASD 2009-12-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 b11ght 的回复:]
synchronized是加锁的意思,是为了同步。
[/Quote]这个说的是对的 同步了
liu_liyang 2009-12-27
  • 打赏
  • 举报
回复
synchronized (b)是加锁的意思。就是b执行的时候。别的都要等待。。当他完全执行完了,再执行其它的。。。没有了多线程同时抢资源的问题
dengkuilin 2009-12-27
  • 打赏
  • 举报
回复
xue x i
liujun3512159 2009-12-25
  • 打赏
  • 举报
回复
5楼解释的应该是对的
dengsf 2009-12-25
  • 打赏
  • 举报
回复
在多个线程要互斥访问数据,
但线程间需要同步时——例如任务分多个阶段,特定线程负责特定阶段的情况,
经常合作使用synchronized 和 wait()

wait()时会先释放当前线程所拥有的锁,
当从wait状态返回时,会再次获取之前的锁,之后再执行后续代码。
这点由JVM保证,可查JDK文档。
估计最初这样设计就是为了满足上述的需求。
苍蝇①号 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 b11ght 的回复:]
synchronized是加锁的意思,是为了同步。
[/Quote]
wait()是等待线程结束
加载更多回复(5)

62,635

社区成员

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

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