zoukankan      html  css  js  c++  java
  • Java中sleep,wait的区别

    两者可以说没什么关系,要说联系,他们都是作用于“线程”的。

    sleep是Thread的类方法,wait是Object实例的方法,需要同样是Object的notify,notifyAll一起配合使用。

    sleep:指定一段时间,这段时间内执行Thread.sleep(xxx)的线程会暂停xxx毫秒,暂停即cpu停止向下执行该线程的代码,如果此时线程持有某些,在sleep期间,不影响对锁的持有,即不会释放锁。

    wait:在一个线程A里的一段同步代码中,如果对线程A持有的锁(某个对象)调用了wait,则A会释放锁,并进入该对象的等待池。同步的代码块中代码暂停执行,直到其他线程调用了该对象的notify或notifyAll方法(让等待池中的某一个或者全部线程进入锁池),当A进入锁池时,他会参与争夺锁,最后当A终于再次持有锁时,代码从上次暂停处继续执行

    :即对象监视器(Object Monitor)

    关于等待池和锁定池(来自https://blog.csdn.net/emailed/article/details/4689220)

    锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

    等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

    static void sleep(long millis)
    Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.

    ------

    void wait

    Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.

  • 相关阅读:
    php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项
    Linux 文件系统IO性能优化【转】
    MOOC Linux内核之旅小结【转】
    python实战===教你用微信每天给女朋友说晚安【转】
    wxpy: 用 Python 玩微信【转】
    AMBA总线协议AHB、APB、AXI对比分析【转】
    高手进阶,终极内存技术指南——完整/进阶版 II (转)【转】
    ARMCC和GCC编译ARM代码的软浮点和硬浮点问题 【转】
    程序员必知之浮点数运算原理详解【转】
    Hash算法【转】
  • 原文地址:https://www.cnblogs.com/chitanta/p/8962062.html
Copyright © 2011-2022 走看看