public class testwait implements Runnable{ public synchronized void wo() {
this.notify();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("这个是wowowo");
}

public synchronized void ta() throws InterruptedException{
this.wait();
System.out.println("这个是tatata");
}

public static void main(String[] args) throws InterruptedException {
testwait ee=new testwait();
Thread ss=new Thread(ee);
                   ee.ta(); 
ss.start();

}

public void run() {
wo();
}}为什么输出结果是
这个是wowowo
这个是tatata程序执行到
public synchronized void wo() {
this.notify();
时,不是唤醒了
public synchronized void ta()
吗?为什么还是
public synchronized void ta()
最后执行?初学JAVA,这里不太懂。希望大家指点下,谢谢。

解决方案 »

  1.   

    public synchronized void wo() {
            this.notify(); //这里虽然唤醒了ta,但是这个线程本身还在方法里,
                              //也就是说还在synchronized块,还在占用资源锁,所以其他线程还是没法执行
                              //必须等此线程结束了synchronized块,释放资源锁,其他线程才有可能执行
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("这个是wowowo");
        }
      

  2.   

    按你提交的代码运行,程序会死,因为main线程调用=testwait.ta()会死住,所以  ss.start();这行不会执行    public synchronized void wo() {
            this.notify();
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("这个是wowowo");
        }
        
        public synchronized void ta() throws InterruptedException{
            this.wait();
            System.out.println("这个是tatata");
        }
        
        public static void main(String[] args) throws InterruptedException {
            testwait ee=new testwait();
            Thread ss=new Thread(ee);
            ss.start();
            ee.ta(); 
            
        }
        
        public void run() {
            wo();
        }}
    public class testwait implements Runnable{    public synchronized void wo() {
            this.notify();
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("这个是wowowo");
        }
        
        public synchronized void ta() throws InterruptedException{
            this.wait();
            System.out.println("这个是tatata");
        }
        
        public static void main(String[] args) throws InterruptedException {
            testwait ee=new testwait();
            Thread ss=new Thread(ee);
            ss.start();
            ee.ta(); 
            
        }
        
        public void run() {
            wo();
        }}
      

  3.   

    我运行了你的程序,结果什么也没有,你确定没有出什么错么,请查看一下。从别处粘贴一点:       Object的方法:wait()和notify()等
           每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。
           由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中调用sleep()时,线程虽然休眠了,但是对象的机锁没有被释放,其他线程仍然无法访问这个对象。而wait()方法则会在线程休眠的同时释放掉机锁,其他线程可以访问该对象。        Wait()方法和notify()方法:当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的机锁。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程从锁池中获得机锁,然后回到wait()前的中断现场。
      

  4.   

    劳驾 谁能给解释一下
    为什么this.wait()会死住呢?
    不理解 谢谢了
      

  5.   

    代码运行到ee.ta()时,只有一个线程即main线程,这时ta方法中的wait便是针对主线程,我汗主线程都让你wait掉了,谁还给你继续运行!!
      

  6.   

    看了一些文章 http://www.javaworld.com/javaworld/jw-04-1996/jw-04-synch.html
    这时一个pingpong的例子,
    synchonized wait notify 的例子, 感觉是用 wait和 notify的时候是应用在不同的object上比较ok,要不然就sleep join 知道完成。不用wait和notify 
    不知道有没有帮助
      

  7.   

    JAVA 学的不是很好,正在努力学习中。希望5楼能说的具体点,哪里写的不对?希望5楼多多指教?谢谢
      

  8.   


    主线程是wait了,但是在
    public synchronized void wo() 
    不是唤醒了吗?
      

  9.   

    LZ看我上面的分析了吗?
    wo虽然notify了,但是wo方法本身还没结束,也就是说synchronized void wo() 还在synchronized的作用范围里,其他线程必须等待synchronized作用范围结束,也就是等待wo方法释放资源锁,才有可能执行。
    比如说,张三现在拿着钥匙,他在楼里喊“我把钥匙放回去了,你么可以去取了”,他虽然喊了,但是实际上还没放回去,这时李四听到了,也就是被唤醒了,他想去拿钥匙,但是张三还没放回原位,所以李四还是拿不到,只能等张三真的把钥匙还了,他才能取。
    这么解释不知道LZ明不明白?
      

  10.   

    这程序不用跑,问题很明显,问题就是LS说的
    ee.ta(); //这里主线程会发生wait,后面的代码无法继续执行,这两行代码换个位置就可以
    ss.start();
    好奇的问一下,LZ是怎么能执行出结果的?