Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当另一个线程通知线程时,线程执行从何处开始?_Java_Multithreading_Wait_Synchronized_Notify - Fatal编程技术网

Java 当另一个线程通知线程时,线程执行从何处开始?

Java 当另一个线程通知线程时,线程执行从何处开始?,java,multithreading,wait,synchronized,notify,Java,Multithreading,Wait,Synchronized,Notify,当通知线程T(等待锁定myObject)时, 从哪里开始执行,在第1行还是第3行?谢谢 在第3行,线程执行是线性的,它 不能回去,也不能跳到那样的地方 被通知的线程需要重新获取锁,但是重新获取发生在wait调用中,线程从wait方法返回后就拥有锁,然后在第3行开始执行。是正确的(+1) 政府对此表示支持,它说: 然后从该对象的等待集中删除线程T,并重新启用线程调度。然后,它以通常的方式与其他线程竞争在对象上同步的权利;一旦它获得了对对象的控制权,它对对象的所有同步声明都将恢复到原来的状态——也就

当通知线程T(等待锁定myObject)时,

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

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

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

被通知的线程需要重新获取锁,但是重新获取发生在wait调用中,线程从wait方法返回后就拥有锁,然后在第3行开始执行。是正确的(+1)

政府对此表示支持,它说:

然后从该对象的等待集中删除线程T,并重新启用线程调度。然后,它以通常的方式与其他线程竞争在对象上同步的权利;一旦它获得了对对象的控制权,它对对象的所有同步声明都将恢复到原来的状态——也就是说,恢复到调用wait方法时的状态。线程T然后从wait方法的调用返回。因此,从wait方法返回时,对象和线程T的同步状态与调用wait方法时完全相同


你可以测试一下。如果线程必须在块的顶部重新开始,那么您可以通过If测试来检查条件,因为一旦通知线程,它仍然必须通过条件测试。如果线程从它停止的地方开始运行,您需要while循环,因为线程需要检查使它必须等待的条件是否仍然为true。如果用If语句替换while循环并运行多线程测试(例如,您可以创建一个队列,一个您可以篡改其put和take方法的自制队列,多个生产者和消费者等待队列非空)然后,您应该能够看到线程等待的情况,然后即使条件不允许也继续进行(导致尝试从空队列中获取某些内容)。

尝试时会发生什么?但是如果myObject正被另一个线程使用,那么该线程如何进入块?顺便说一句,这个代码示例应该执行
myObject.wait()
。否则,除非
myObject==this
或该代码也在由
this
同步的块中,否则在尝试调用
this.wait()
@peter.petrov…感谢您的回复时,您将遇到异常。根据您的更正,我已对问题进行了编辑。@Nathan…谢谢您的答复。这也消除了我主要(或家长)的疑虑,即为什么应该只在循环中调用wait。到目前为止,我一直假设执行从第1行开始。谢谢
public  void add(int num)
{
 synchronized(myObject){
 // line 1
 //line 2
 while(!condition)
 {
  myObject.wait();
  //line 3
 }    
 //line 4
 //line 5
 //line 6
 }
}