黑马程序员技术交流社区

标题: 关于线程的wait()方法.. [打印本页]

作者: 芦青    时间: 2013-4-14 18:10
标题: 关于线程的wait()方法..
本帖最后由 芦青 于 2013-4-15 18:13 编辑

class Xc implements Runnable
{
        int piao=100;
        public void run()
        {
                while(true)
                {
                        synchronized(Xc.class)
                        {        

                                if(piao>0)
                                {        try{wait();} catch(Exception e){}
                                        System.out.println(Thread.currentThread()+"..."+piao--);
                                }
                        }         
                }
        }
}

class Demo
{
        public static void main(String[] args)
        {
                Xc x=new Xc();
                Thread t1=new Thread(x);
                Thread t2=new Thread(x);
                t1.start();
                t2.start();
               
        }
}
疑问:t1和t2的线程,去执行的时候,为什么没有等待,我没有唤醒啊..

还有,在sleep()方法中,一个线程休息,但并没有放弃锁,别的线程进步来,但使用wait()方法,另一个线程还能进来执行..
是不是sleep()方法没有放弃锁,而wait()方法放弃了锁?

作者: ①人←①城市    时间: 2013-4-14 18:28
主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。


使用范围:wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
   synchronized(x){
      wait()
   }

sleep必须捕获异常,而wait不需要捕获异常
作者: 沈浩    时间: 2013-4-14 18:32
你上面的代码中   线程根本就没等待    因为没有调用wait方法   你要标示是持有什么锁的线程要等待  它才会等待   
synchronized(Xc.class)
                        {        

                                if(piao>0)
                                {        try{Xc.class.wait();} catch(Exception e){}//要标示是持有Xc.class锁的线程调用wait()方法
                                        System.out.println(Thread.currentThread()+"..."+piao--);
                                }
                        }         
作者: 张洪慊    时间: 2013-4-14 19:08
1.为什么wait,notify,notifyall必须用在同步中?(API文档)
  当前线程必须拥有此对象监视器(锁)。
  该线程发布(放弃)对此监视器(锁)的所有权并等待,
  直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。
  然后  该线程将等到重新获得对监视器的所有权后才能继续执行。
2.为什么需要标识出 wait操作的 线程所持有的锁?
  因为可能出现同步嵌套,出现多个锁
  同一个锁上等待的线程,只能被同一个锁上的线程唤醒
3.sleep与wait(API)
sleep: 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
          该线程不丢失任何监视器(锁)的所属权。  
wait:在第一条已说明


作者: 黄玉昆    时间: 2013-4-15 12:07
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2