A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 芦青 中级黑马   /  2013-4-14 18:10  /  1423 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 芦青 于 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()方法放弃了锁?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

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

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


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

sleep必须捕获异常,而wait不需要捕获异常

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你上面的代码中   线程根本就没等待    因为没有调用wait方法   你要标示是持有什么锁的线程要等待  它才会等待   
synchronized(Xc.class)
                        {        

                                if(piao>0)
                                {        try{Xc.class.wait();} catch(Exception e){}//要标示是持有Xc.class锁的线程调用wait()方法
                                        System.out.println(Thread.currentThread()+"..."+piao--);
                                }
                        }         

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
1.为什么wait,notify,notifyall必须用在同步中?(API文档)
  当前线程必须拥有此对象监视器(锁)。
  该线程发布(放弃)对此监视器(锁)的所有权并等待,
  直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。
  然后  该线程将等到重新获得对监视器的所有权后才能继续执行。
2.为什么需要标识出 wait操作的 线程所持有的锁?
  因为可能出现同步嵌套,出现多个锁
  同一个锁上等待的线程,只能被同一个锁上的线程唤醒
3.sleep与wait(API)
sleep: 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
          该线程不丢失任何监视器(锁)的所属权。  
wait:在第一条已说明

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马