zoukankan      html  css  js  c++  java
  • sleep和wait的区别

    sleep和wait的区别有:
    1,这两个方法来自不同的类分别是Thread和Object
    2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
    3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    任何地方使用
    synchronized(x){
    x.notify()
    //或者wait()
    }
    4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

    关于wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();

    notify()唤醒的是等待锁的对象,调用:对象.notify();

    如下:

    Object obj = newObject();

    synchronized(obj){

        try{  

          obj.wait();

          }catch(Exception e){}

          obj.notify();

      }

    注意:wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步 才具有锁。

    为什么这些操作线程的方法要定义在object类中呢?

    简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。

    专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。

    也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。

  • 相关阅读:
    Java RandomAccessFile与MappedByteBuffer
    Apache httpClient
    gitolite migration to bitbucket
    logback身份证脱敏
    身份证号码-正则表达式
    webservice-整理
    Java高编译低运行错误(ConcurrentHashMap.keySet)
    IIS(互联网信息服务)
    ASP.NET MVC:UrlHelper.cs
    TortoiseSVN 和 VisualSVN
  • 原文地址:https://www.cnblogs.com/AndyAo/p/8120150.html
Copyright © 2011-2022 走看看