`

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常见面试问题及答案.docx

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

    Java 语言程序设计基础

    5. **线程的暂停:** 使用 `Thread.sleep()` 方法让线程暂停一段时间。 6. **线程之间的交互:** 通过 `wait()` 和 `notify()` 方法实现线程间的通信。 #### 九、文件管理和输入输出 Java 提供了丰富的 API 来处理...

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

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

    JAVA相关的面试大全

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

    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