`

Thread.sleep(long)和object.wait(long)的共同点和不同点

阅读更多

转载  Thread.sleep(long)和object.wait(long)的共同点和不同点(zz)- 收藏

 

共同点:  他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。

不同点:  Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
              object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。

举个java.util.Timer的例子来说明。

private void mainLoop() {
        while (true) {
        ....
        synchronized(queue) {
        .....
        if (!taskFired) // Task hasn't yet fired; wait
              queue.wait(executionTime - currentTime);
        }
}

在这里为什么要使用queue.wait(),而不是Thread.sleep(), 是因为暂时放弃queue的对象锁,可以让允许其它的线程执行一些同步操作。如:
private void sched(TimerTask task, long time, long period) {
          synchronized(queue) {
              ...
              queue.add(task);
          }
}

但是正如上篇文章讲到的,使用queue.wait(long)的前提条件是sched()动作执行的时间很短,否则如果很长,那么queue.wait()不能够按时醒来。

分享到:
评论

相关推荐

    面试专题-并发篇讲义.pdf

    - `sleep()`是`Thread`类的静态方法,而`wait()`是`Object`类的方法。 - `wait()`需要在持有对象锁的同步块或方法中调用,否则抛出`IllegalMonitorStateException`,而`sleep()`无此限制。 - `wait()`可以通过`...

    Java并发编程实践-电子书-01章

    `interrupt()`方法可以请求中断线程,通常与`Thread.sleep()`或`Object.wait()`一起使用,以便在等待过程中响应中断请求。 ```java Thread thread = new Thread(() -> { try { Thread.sleep(1000); } catch ...

    JAVA常见面试问题及答案.docx

    `sleep`和`wait`的区别** - `sleep`:是`Thread`类的方法,可以使当前线程暂停指定的时间,期间线程会释放CPU资源但不释放锁资源。 - `wait`:是`Object`类的方法,用于线程之间的同步。调用此方法的线程会释放锁...

    本文主要介绍java中并发的原理还有Java中锁实现的原理

    4. **所属类的不同**:`sleep()`是`Thread`类的静态方法;`wait()`则是`Object`类的方法。 #### 二、JMM(Java内存模型) ##### 2.1 指令重排 为了提高程序执行效率,计算机可能在不影响单线程程序语义的前提下,...

    JAVA相关的面试大全

    - 不同点:Java接口只能包含抽象方法,而C++虚类可以有具体实现。 #### 50. Java中的异常处理机制的简单原理和应用 Java异常处理机制主要包括`try-catch-finally`结构,以及自定义异常类。 #### 51. 垃圾回收的...

    java面试笔试题大汇总

    #### 十二、sleep()和wait()有什么区别? 1. **Thread.sleep()**: `Thread.sleep()`方法使当前正在执行的线程暂停执行指定的时间,然后恢复执行。这个方法不会释放锁,线程仍然持有任何它持有的锁。 2. **Object....

    Java 面试宝典 2012版 pdf

    抽象类更适用于有共同属性和行为的类的抽象,而接口更适用于定义行为标准。 ### 25. 抽象方法与修饰符 抽象方法不可以是静态、原生或同步的,因为它们不包含具体的实现,无法被静态调用、原生实现或同步控制。 ##...

    java面试宝典

    ### Java面试宝典知识点梳理 #### 一、基础概念与语法 **1. ".java"文件是否必须以.java为扩展名?** - **答案:** 不一定非得使用.java作为扩展名,但这是约定俗成的做法,易于识别并被开发工具支持。 - **解释:*...

    1000道包含JAVA所有知识点面试的宝典

    - **共同点**:都是异常,需要妥善处理以避免程序崩溃。 #### 42. `Error`与`Exception`的区别 - **`Error`**:严重错误,程序无法处理,如`OutOfMemoryError`。 - **`Exception`**:可以通过程序捕获并处理的一般...

Global site tag (gtag.js) - Google Analytics