`
chriszeng87
  • 浏览: 738326 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解sleep和wait的区别

    博客分类:
  • Java
阅读更多

转自:http://www.cnblogs.com/DreamSea/archive/2012/01/16/2263844.html    有改动

 

sleep()方法
  sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;
   sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
  在sleep()休眠时间期满后,该线程不一定会立即执行,这是因为其它线程可能正在运行而且没有被调度为放弃执行,除非此线程具有更高的优先级。 
   
wait()方法
  wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还需要返还对象锁);其他线程可以访问;
  wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
  wiat()必须放在synchronized block中,否则会在program runtime时扔出”java.lang.IllegalMonitorStateException“异常。

 
  所以sleep()和wait()方法的最大区别是:
    sleep()睡眠时,保持对象锁,仍然占有该锁;
    而wait()睡眠时,释放对象锁。
  但是wait()和sleep()都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。
 
/**
 * Thread sleep和wait区别
 * @author DreamSea 
 * 2012-1-15
 */
public class Test implements Runnable {
    int number = 10;

    public void firstMethod() throws Exception {
        synchronized (this) {
            number += 100;
            System.out.println("firstMethod " + number);
        }
    }

    public void secondMethod() throws Exception {
        synchronized (this) {
            /**
             * (休息2S,阻塞线程)
             * 以验证当前线程对象的机锁被占用时,
             * 是否被可以访问其他同步代码块
             */
        	System.out.println("secondMethod begin " + number);
            Thread.sleep(2000);
//            this.wait(2000);
            number *= 200;
            System.out.println("secondMethod " + number);
        }
    }

    @Override
    public void run() {
        try {
            firstMethod();
        } catch (Exception e) {
            e.printStackTrace();  
        }
    } 

    public static void main(String[] args) throws Exception {
    	Test threadTest = new Test();
        Thread thread = new Thread(threadTest);
        thread.start();
        threadTest.secondMethod();
    }
}
 我们来大致分析一下此段代码,main()方法中实例化Test并启动该线程,然后调用该线程的一个方法(secondMethod()),因为在主线程中调用方法,所以调用的普通方法secondMethod())会先被执行(但并不是普通方法执行完毕该对象的线程方法才执行,普通方法执行过程中,该线程的方法也会被执行,他们是交替执行的,只是在主线程的普通方法会先被执行而已),所以程序运行时会先执行secondMethod(),而secondMethod()方法代码片段中有synchronized block,因此secondMethod方法被执行后,该方法会占有该对象机锁导致该对象的线程方法一直处于阻塞状态,不能执行,直到secondeMethod释放锁;
使用Thread.sleep(2000)方法时,因为sleep在阻塞线程的同时,并持有该对象锁,所以该对象的其他同步线程(secondMethod())无法执行,直到synchronized block执行完毕(sleep休眠完毕),secondMethod()方法才可以执行,因此输出结果为number*200+100;
使用this.wait(2000)方法时,secondMethod()方法被执行后也锁定了该对象的机锁,执行到this.wait(2000)时,该方法会休眠2S并释当前持有的锁,此时该线程的同步方法会被执行(因为secondMethod持有的锁,已经被wait()所释放),因此输出的结果为:number+100;
分享到:
评论

相关推荐

    Sleep和Wait的区别.pdf

    ### Sleep与Wait的区别详解 #### 一、基本概念 在多线程编程中,`sleep`和`wait`是两个非常重要的方法,用于控制线程的执行和协调多个线程之间的交互。理解这两个方法的不同之处对于正确实现多线程程序至关重要。 ...

    详解Java中wait和sleep的区别

    "详解Java中wait和sleep的区别" Java中wait和sleep的区别是Java多线程编程中一个重要的概念。这两个方法都可以用来暂停当前线程的执行,但是它们之间有着根本的区别。 首先,wait()是一个用于线程同步的实例方法...

    详解Java中的sleep()和wait()的区别

    在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...

    java sleep和wait的解惑.docx

    ### Java中的sleep与wait详解 #### 一、概述 在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这...

    java sleep()和wait()

    ### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...

    JAVA线程sleep()和wait()详解及实例

    JAVA线程sleep()和wait()详解及实例 JAVA线程sleep()和wait()是两个常用的线程控制方法,用于控制线程的执行和同步。本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地...

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    java 中sleep() 和 wait() 的对比

    在Java编程中,`sleep()` 和 `wait()` 都是用来控制线程的执行流程,但它们之间存在着显著的区别。理解这些差异对于编写多线程程序至关重要。 `sleep()` 是 `java.lang.Thread` 类的一个静态方法,它使得当前正在...

    wait和notifyAll方法的使用示例

    ### 使用wait和notifyAll方法详解 #### 一、引言 在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者...

    Java线程详解大全

    不可运行状态可能因调用`sleep()`、`wait()`或I/O阻塞等原因导致,线程暂停执行。当这些条件满足时,线程会回到可运行状态,直至run()方法执行完毕,线程进入消亡状态。 Java提供了两种线程实现方式:继承`Thread`...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    - `wait()`, `notify()`和`notifyAll()`方法用于线程间通信,需在同步环境中使用。 5. **线程通信问题** - 生产者-消费者问题:一个线程生产数据,另一个线程消费数据,需要避免生产者过度生产或消费者提前消费。...

    LinuxC函数详解

    - `wait` 和 `waitpid`:等待子进程结束,并获取其退出状态。 - `pthread_create` 和 `pthread_join`:在Linux上创建和管理线程。 6. **信号处理函数**: - `signal` 和 `sigaction`:注册信号处理函数,处理...

    python 线程的暂停, 恢复, 退出详解及实例

    ### Python线程的暂停、恢复与退出详解 在Python中,多线程是通过`threading`模块来实现的。然而,在默认情况下,该模块并未直接提供暂停、恢复以及退出线程的功能。这意味着一旦线程启动(即调用了`start()`方法)...

    Java多线程编程详解

    ### Java多线程编程详解 #### 一、线程的同步机制 在Java多线程编程中,线程之间的同步是非常重要的概念。由于同一进程中的多个线程共享相同的内存空间,这可能导致数据竞争条件(race condition)的问题。为了...

    java 多线程设计模式 进程详解

    wait()和sleep() 线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 ...

    Linux函数详解(函数大全)

    `wait`和`waitpid`用于父进程等待子进程结束,获取其退出状态。 内存管理在C语言编程中不可或缺,`malloc`和`free`用于动态分配和释放内存,`calloc`则可以一次性分配并初始化内存,`realloc`用于调整已分配内存的...

    Java线程编程方面面试题详解

    68、`synchronized`和`java.util.concurrent.locks.Lock`的主要区别在于,`synchronized`是隐式锁定,自动释放,而`Lock`是显式锁定,需要程序员手动释放,并且提供了更细粒度的控制,如可中断的等待和尝试获取锁等...

    java多线程机制 详解

    阻塞状态可能因等待资源、调用sleep、wait方法或I/O操作而进入;死亡状态是run方法执行完毕。 创建线程主要有两种方式: 1. 继承Thread类:自定义Thread的子类,覆盖run方法,然后创建Thread子类的实例并调用start...

Global site tag (gtag.js) - Google Analytics