已经用sleep()方法了,是否可以用wait()或notifyAll()方法替换

解决方案 »

  1.   

    sleep()用于暂时停止一个线程的执行, wait()方法的作用是让当前线程释放其所持有的"对象互斥锁",进入wait队列(等待队列);而notify()/notifyAll方法的作用是唤醒一个或所有正在等待队列中等待的线程,并将它(们)移入等待同一个"对象互斥锁"的队列。
      需要指出的是,notify()/notifyAll方法和wait()方法都只能在被声明为synchronized 的方法或代码段中调用!!
      

  2.   

    wait()方法要释放对象锁。而sleep()不会释放对象锁。notify()唤醒正在等待的单个线程,而notifyAll()唤醒所有正在等待的线程,加入到Cpu时间片段额竞争中  当然正如一楼所说的要在synchronized同步方法或者是同步代码块中执行。。
      

  3.   

    http://www.ticmy.com/?p=219
      

  4.   

        在java的学海里面,有着很多的东西,耐人寻味,引人入胜。
        我在java里也工作3个年头了,不过我觉得自己学的东西仿佛只是java的冰山一角。
    现在一直边工作边学习,在工作的过程中,学会了很多东西,这些都是在书上,在教程当中所学习不到的,特别在项目开发当中的话,觉得"交流"特别重要,不管你个人技术水平有多高,不管你个人全能否,都不外乎需要"交流"。
        Struts1,Struts2,Spring,Hibernate,EJB,Ibabtis等项目经常需要用的框架,我们或者对其已经熟悉的不能再熟悉了,不过,在此又有个很大的弊端,有些工作了些许年的程序员,现在还依旧只知道这些框架怎么去用,但是不知道为什么可以这样去用。说一次我面试的经历,今天老大喊我帮忙去面试个人,我看了下来面试的人的简历,一看工作时间竟然有10年? 我但是心里一颤抖,尽然我这个刚工作3年面试一个10年经验的不过,后面开始面试了,我也稍许淡定了些,不为什么,就因为我觉得对面的10年工作程序员也不过如此。因为,我问了他关于框架的东西,他无所不知,问他一个问题,他可以回答我3个出来,但是我一问java基础,反射,代理模式,单例模式,和这些框架一些底层实现的方法之类的,他竟然像个孩子一样无助的看着我
        我回去之后想了很多,10年的工作经验在开发生涯当中,已经算是"白骨精"(白领,骨干,精英)的境界了,可能说早已经成为管理层的一员了。不过,这位,还依旧在找着编码工作,我并不是有其他的想法,而是我觉得,在很多时候,一件事物的存在时有很多原因的,多方面去关注才能看清楚事物的本质。所以,我想到的就是为什么会这样?第一个,很简单很明显的就是,在工作中,还需要继续的学习。我记得我的以前的老大和我说过一个故事。
         有个面包师,在麦当劳工作了有3年了,每天重复着单一的工作内容,但是在刚开始的觉得过得还不错,因为在那个时候工资待遇不错,工作要求水平也不高,也就这么不错的过着。但是就只在第三年,他的工资依旧没有涨过,他一次和老板提加薪要求,但是被老板一口回绝,并说着:你做的事情每一个不懂的人只需要稍微学习下就行了,你不做自然有人会来做。后来一了解,麦当劳面包师不能说是面包师,而是烹饪师,因为一切的原料都已经做好了,他只需要把那些面包和汉堡之类的放微波炉中,油锅里面热一热,炸一炸就可以出炉了。后来,经人介绍,买下了一个小小的面包作坊,他可能说是自己也了解到自己为什么做了这么久的时间还得不到老板加薪,自己刻苦的钻研着怎么让自己的面包更让顾客喜欢,更吸引别人,后来也就凭着自己的努力,终于做好了自己的品牌,成功了。
         故事说了有点罗嗦,但是你看了之后应该会明白些什么,只有你成为了一个团队,一个生活圈不可或缺的人的时候,你才能活的自由,你才能获得你相应的报酬,如果你是那个获得或缺的人,那你的存在就显得不那么的重要,自然你就不会成为可以主宰的人。
        第二个,怎么继续学习?就像我前面说的,不能只图方便,只图着一时的轻松,周而复始的这么做的,就像说的这个框架你使用的不能再熟练了,但是你还是一样,只是知道怎么使用,但是一个框架的最主要的不是怎么去使用,而是懂得其底层的思想。就想你熟悉的java,如果再让你去学习C#语言,可能不会像你刚学习java的时候那么困难了吧?但是从中,我又想起了一点,不知道是人性的问点,还是个别人的问题。在学习的时候,坚持不了,只会做三分钟先生。包括我,有的时候也有这些看似没多大问题,其实很严重的问题。
       我很困扰,我真的很困扰自己该怎么解决这个问题,难道还请个人来一起学习自己才能学习的上心些么?因为自己在那个时候刚出来,心浮气躁的,根本来说静不下心来说去好好学习。后来由着朋友介绍了一些技术群,和大家一起讨论问题解决问题,我很享受这种感觉,和大家一起学习互相鼓励,后来也懂得一些做人,做事,做学问的方法和道理,就是一个人可能不那么强大,集所有人的力量一定能够解决看似很强大的bug.
        现在我经过了那段热血的但是及其浮躁的年代,现在我想把自己的一些经验告诉大家,而且我也想让大家能够在一起学习,而且是一起互帮互助学习,不管是在工作当中还是在学习,都得明白和大家多交流,一起多学习,而且对于别人的建议和推荐一定要好好考虑!
        我在很多技术论坛都学习过,不过我觉得在很多论坛中学习的资料是很多,但是在某些方面来说的话,并不是很适合每一个人,我觉得在很多时候有想学的但是没有肯教的,所以我想有个能让每一个人都有学的地方就好了,因为在群里聊天的话也只能不太固定的教些东西,而且也不能让所有人参与进来。所以我自己弄了个论坛,www.90cxy.com 90程序员,刚刚起步,不为了名,不为了利,只想有个可以和很多人一起学习的平台,虽然不说很好,但是我想,可以让每个人都不至于空手而归。
      

  5.   

    sleep():使某个线程暂停一定的时间,之后继续执行;
    wait():使某个线程进入休眠状态,直至有人将其唤醒
    notifyAll():即是将所有的处于wait状态的线程唤醒
      

  6.   

    sleep(),wait()、notifyAll()属于不同对象上的方法
    sleep()是线程上的方法,作用的让线程休眠,到了时间点自动唤醒线程
    wait()是Object上的方法,意思是让使用这个对象的线程等待
    notifyAll也是Object上的方法,唤醒使用该对象等待的所有线程
      

  7.   

    wait()方法要释放对象锁。
    sleep()不会释放对象锁
    notify()唤醒正在等待的单个线程
    而notifyAll()唤醒所有正在等待的线程,加入到Cpu时间片段额竞争中
    支持6楼
      

  8.   

    wait()notify()是只用在同步块或者同步方法中的当多个线程同时操作一个引用时,我们可以用synchronized 声明同步方法 
     或者 使用synchronized(obj){}代码块
    保证引用的数据安全。通过obj这把锁头决定 A 线程先操作  其他线程在锁池等待  等A结束交出锁头  ,其他线程再抢。如果A在运行中被阻塞了:
    1.是被wait()阻塞了,A会进入等待池,必须有其他线程唤醒A,A才能进入锁池,等待抢锁。
    2.是被sleep()阻塞了,A会睡一会,但是锁头不交,醒了继续执行。
    3.是被yield()阻塞了,A会让位,然后再抢,但是因为他自己拿着锁头呢,所以抢的人只有他一个,结果还是他运行。