回 帖 发 新 帖 刷新版面

主题:请教关于wait()方法的问题

public class TwoThreads { 
static Thread laurel, hardy; 

public static void main(String[] args) { 
laurel = new Thread() { 
public void run() { 
System.out.println("A"); 
try { 
hardy.sleep(1000); 

} catch (Exception e) { 
System.out.println("B"); 


System.out.println("C"); 

}; 
hardy = new Thread() { 
public void run() { 
System.out.println("D"); 
try { 


synchronized (laurel) { 

laurel.wait(); 

} catch (Exception e) { 
System.out.println("E"); 

System.out.println("F"); 

}; 
laurel.start(); 
hardy.start(); 



这个地方: 
synchronized (laurel) { 
laurel.wait(); 

} catch (Exception e) { 
System.out.println("E"); 
到底是让laurel线程等待还是让hardy线程等待啊?如果是hardy的话为什么不起做用呢,没有用notify()方法为什么程序也能正常结束呢? 
(初学者) 
[em18]

回复列表 (共3个回复)

沙发

我也不懂。

板凳

hardy线程如果得到了laurel'资源',那么hardy线程就暂时停止(等待),laurel线程开始执行,因为laurel线程是一个简单的函数,它执行了完毕结束后,就会发出了notify通知,结果是hardy线程重新开始执行直至结束.所以,没有notify也可以.

3 楼


这个地方: 
synchronized (laurel) { 
laurel.wait(); 

} catch (Exception e) { 
System.out.println("E"); 
到底是让laurel线程等待还是让hardy线程等待啊?如果是hardy的话为什么不起做用呢,没有用notify()方法为什么程序也能正常结束呢? 
(初学者) 

synchronized (laurel) //此处是将锁转移给laurel对象,而使此同步快所在的线程处于等待。
//同样你应该在其他线程中调用laurel.notify();方法再次唤醒那个被等待的线程,应注意wait和notify的调用应该是一个对象才行。
而且唤醒的前提是存在notify方法的同步快执行完毕才行。

laurel.wait(); 

} catch (Exception e) { 

我来回复

您尚未登录,请登录后再回复。点此登录或注册