首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当线程被另一个线程通知时,它从哪里开始执行?

当线程被另一个线程通知时,它从哪里开始执行?
EN

Stack Overflow用户
提问于 2014-05-21 17:22:14
回答 2查看 112关注 0票数 3
代码语言:javascript
复制
public  void add(int num)
{
 synchronized(myObject){
 // line 1
 //line 2
 while(!condition)
 {
  myObject.wait();
  //line 3
 }    
 //line 4
 //line 5
 //line 6
 }
}

当线程T(等待myObject上的锁)被通知时,

T从哪里开始执行,在第1行还是第3行?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-21 17:44:36

通知的线程需要重新获取锁,但是这种重新获取发生在等待调用中,并且线程一旦从等待方法返回,就会有锁,然后在第3行开始执行。彼得的回答是正确的(+1)。

javadoc等待支持这一点,它说:

然后,将线程T从此对象的等待集中移除,并重新启用线程调度。然后,它以通常的方式与其他线程竞争对象上的同步权;一旦它获得了对对象的控制,它对对象的所有同步要求就会恢复到原状--即恢复到调用等待方法时的状态。线程T然后从等待方法的调用返回。因此,在等待方法返回时,对象和线程T的同步状态与调用等待方法时完全相同。

你可以试试这个。如果线程必须在块顶部重新启动,那么您可以通过一个If测试来检查条件,因为一旦通知了线程,它仍然必须通过条件测试。如果线程恢复到它停止的位置,则需要while循环,因为线程需要检查必须等待的条件是否仍然为真。如果您用If语句替换while循环并运行多线程测试(例如,您可以创建一个队列,一个本地队列,您可以在这个队列中篡改其put和test方法,使用多个生产者和使用者等待队列为非空),那么您应该能够看到线程等待的情况,即使条件不应该让它继续进行(结果是试图从一个空队列中获取一些东西)。

票数 1
EN

Stack Overflow用户

发布于 2014-05-21 17:23:41

在第3行,线程执行是线性的,它

不能回去,也不能跳到那样的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23789987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档