java/Thread/-》 wait 小问题!

来源:百度知道 编辑:UC知道 时间:2024/09/28 15:30:22
问题1:为什么会产生这两种情况?
问题2:即第B行。

public class TestWait {
public static void main(String[] args) throws InterruptedException {
Thread th=new Tread1();
Object o = new Object();
th.start();
// Thread.sleep(100); 第A行
synchronized (th) {
try {
System.out.println("begin");
th.wait();//这里wait了怎么还往下执行?是让主线程wait吗? 第B行
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Tread1 extends Thread{
public void run(){
System.out.println("I am Thread1.");
}
}

运行结果:
begin
I am Thread1.
end

当把第A行注释去掉后运行结果(这下wait起作用了,程序停住了):
I am Thread1.
begin
感谢tech_java :
“Thread终止的时候会先获取当前对于自己线程的锁,最后,通知其他线程(相当于调用notify方法)。”
以前还不知道有这事。
想继续问下,如果有多个线程也wait在th对象上,还是像这种情况,th这个线程终止的时候是通知所有线程呢(即notifyall)还是任意选一个通知(即notify)?<

你这个问题的关键点在于你锁住的是个Thread,
而Thread终止的时候会先获取当前对于自己线程的锁,最后,通知其他线程(相当于调用notify方法)。这样就会导致wait的线程启动,然后往下运行了。

如果你加上Thread.sleep(100); 那么还没有进入到同步方法,Thread1就已经终止了。

这个时候主线程再wait,就没有人唤醒它了。所以会一直等待.

你这个问题太刁钻了,如果你锁住的是Object o,那么就不会有这种情况出现了,必定会等待的。

问题补充回答:
notifyall。因为线程是本地代码实现的,所以看jdk源代码看不出来。不过你可以参看以下线程组的代码。

运行java 程序时候 :Exception in thread "main" java.lang.NoClassDefFoundError: sport/java 运行CMD搞JAVA 时,为什么总是出现Exception in thread "main" java.lang.NoClassDefoundError :**/java Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/Message java Thread 里面的变量能不能访问? thread main java.lang.NullPointerException Exception in thread main java.lang.NullPointerException "java.lang.NoClassDefFoundError: ebs/Servlet1 Exception in thread "main" "请问怎样解决 悬赏20:Exception in thread "Thread-3" java.lang.ArrayIndexOutOfBoundsException: -718 A Java编程是出现“Exception in thread 'main' java.lang.NoSuchMethodError:main”可能是哪出问题了?/ Exception in thread "main" java.lang.NoXuchMethodError: main Exception in thread "main" java.lang.NoClassDefFoundError