java sleep()和wait()的区别点总结

1、区别说明

wait()是Object的方法,sleep()是Thread的方法。

wait()必须采用同步方法,不需要sleep()方法。

线程在同步方法中执行sleep()方法,不释放monitor锁,wait()方法释放monitor锁。

短暂休眠后,sleep()方法会主动退出阻塞,而wait()方法需要在没有指定wait时间的情况下被其他线程中断才能退出阻塞。

2、实例

import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSleepAndWait {
public static void main(String[] args) {
new Thread1().start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread2().start();
}
}
class Thread1 extends Thread{
private void sout(String s){
System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));
}
@Override
public void run() {
sout("enter Thread1.run");
synchronized (TestSleepAndWait.class){//wait只能在同步代码块或者同步方法中使用
sout("Thread1 is going to wait");
try {
TestSleepAndWait.class.wait(); // 这里只能使用持有锁TestSleepAndWait.class.wait(),使用其他对象则报错java.lang.IllegalMonitorStateException
} catch (InterruptedException e) {
e.printStackTrace();
}
sout("after waiting, thread1 is going on");
sout("thread1 is over");
}
}
}
class Thread2 extends Thread{
private void sout(String s){
System.out.println(s+" "+new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));
}
@Override
public void run() {
sout("enter Thread2.run");
synchronized (TestSleepAndWait.class){//wait只能在同步代码块或者同步方法中使用
sout("Thread2 is going to notify");
TestSleepAndWait.class.notify(); 这里只能使用持有锁TestSleepAndWait.class
sout("thread2 is going to sleep 10ms");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
sout("after sleeping, thread2 is going on");
sout("thread2 is over");
}
}
}

内容扩展:

/**
 *
 */
package com.b510.test;

/**
 * java中的sleep()和wait()的区别
 * @author Hongten Java学习交流QQ群:589809992 我们一起学Java!
 * @date 2013-12-10
 */
public class TestD {

  public static void main(String[] args) {
    new Thread(new Thread1()).start();
    try {
      Thread.sleep(5000);
    } catch (Exception e) {
      e.printStackTrace();
    }
    new Thread(new Thread2()).start();
  }

  private static class Thread1 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
      System.out.println("enter thread1...");
      System.out.println("thread1 is waiting...");
      try {
        //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
        TestD.class.wait();
      } catch (Exception e) {
        e.printStackTrace();
      }
      System.out.println("thread1 is going on ....");
      System.out.println("thread1 is over!!!");
      }
    }
  }

  private static class Thread2 implements Runnable{
    @Override
    public void run(){
      synchronized (TestD.class) {
        System.out.println("enter thread2....");
        System.out.println("thread2 is sleep....");
        //只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。
        TestD.class.notify();
        //==================
        //区别
        //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify()
        //方法,则线程永远处于挂起状态。
        try {
          //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,
          //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
          //在调用sleep()方法的过程中,线程不会释放对象锁。
          Thread.sleep(5000);
        } catch (Exception e) {
          e.printStackTrace();
        }
        System.out.println("thread2 is going on....");
        System.out.println("thread2 is over!!!");
      }
    }
  }
}

到此这篇关于java sleep()和wait()的区别点总结的文章就介绍到这了,更多相关java sleep()和wait()的区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    JAVA线程sleep()和wait()详解及实例 sleep 1.sleep是Thread的一个静态(static)方法.使得Runnable实现的线程也可以使用sleep方法.而且避免了线程之前相互调用sleep()方法,引发死锁. 2.sleep()执行时需要赋予一个沉睡时间.在沉睡期间(阻塞线程期间),CPU会放弃这个线程,执行其他任务.当沉睡时间到了之后,该线程会自动苏醒,不过此时线程不会立刻被执行,而是要等CPU分配资源,和其他线程进行竞争. 3.此外如果这个线程之前获取了一个机锁,

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

    java 中sleep() 和 wait() 的对比 结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了.这篇博客就一起学习这两个方法 sleep() sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间. 因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sl

  • Java中sleep()与wait()的区别总结

    前言 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备 获取对象锁进入运行状态. 什么意思

  • Java线程阻塞方法sleep()与wait()的全面讲解

    一.前期基础知识储备 sleep()和wait()方法都是Java中造成线程阻塞的方法.感兴趣的读者可以参见笔者之前的文章<Java中什么方法导致线程阻塞>,里面详细讲述了为什么Java要造成线程阻塞和Java中造成线程阻塞的几种方法. (1)线程的生命周期 这是笔者在谷歌图片中找到的一张简单描述线程生命周期的图片,可以看到,一个线程正常的生命周期中会经历"创建""就绪""运行""阻塞""运行"

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

    详解Java中的sleep()和wait()的区别 对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态. 在调用sleep()方法的过程中,线程不会释放对象锁. 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象

  • java sleep()和wait()的区别点总结

    1.区别说明 wait()是Object的方法,sleep()是Thread的方法. wait()必须采用同步方法,不需要sleep()方法. 线程在同步方法中执行sleep()方法,不释放monitor锁,wait()方法释放monitor锁. 短暂休眠后,sleep()方法会主动退出阻塞,而wait()方法需要在没有指定wait时间的情况下被其他线程中断才能退出阻塞. 2.实例 import java.text.SimpleDateFormat; import java.util.Date;

  • java中throws与try...catch的区别点

    throws是将异常抛出,后续代码不再执行.而try-catch是将异常抛出,并且要继续执行后面的代码. package com.oracle; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo01Exception { /*Exception:编译期间异常,进行编译(写代码的过程) * runtimeException:运行期异

  • java中catalina.home与catalina.base区别点整理

    以Tomcat6.0为例,其Tomcat目 录结构如下: bin (运行脚本).conf (配置文件). lib (核心库文件). logs (日志目录) .temp (临时目录).webapps (自动装载的应用程序的目录) work (JVM临时文件目录[java.io.tmpdir]) 其中只有 bin 和 lib 目录被多个tomcat示例公用,其它目录conf.logs.temp.webapps和work 每个Tomcat实例必须拥有其自己独立的备份. 明白了上述关系就容易理解cata

  • Java重写与重载之间的区别

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOEx

  • Java 重写与重载方法与区别详解

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 在面向对象原则里,重写意味着可以重写任何现有方法.实例如下: class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public

  • Java重写(Override)与重载(Overload)区别原理解析

    这篇文章主要介绍了Java重写(Override)与重载(Overload)区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常.例如: 父类的一个

  • python与js主要区别点总结

    数据类型 js和python都是动态语言,a = 1; a = 'abc',a这个变量是动态的,类型是随时可以被更改的.而在java中就是静态语言变量,int a = 1:a = 'abc' 就会报错. 基本命令 1.输出 js里面的console.log().document.write().window.alert().document.writeIn() python里面是print() 2.输入 js里面是window.prompt() python里面是input() 3.加注释 js

  • Java基础之重载(Overload)与重写(Override)详解

    一.重载(Overload) 重载是在一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同. 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 最常用的地方就是构造器的重载. 重载的好处: 1.不用为了对不同的参数类型或参数个数,而写多个函数. 2.多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数. 3.重载的最直接作用是方便了程序员可以根据不同的参数个数,顺序,类型,自动匹配方法

  • Java入门绊脚石之Override和Overload的区别详解

    目录 前言: 一.方法重写(Override) 1.方法重写基本概念 2.方法重写基本规则及注意事项 二.overload方法重载 1.什么是重载 2.重载的规则 3.总结: 前言: 各位小伙伴们,大家好,一日不见,如隔一日,今天我给大家分享一下大家在学习java过程当中遇到的一个问题,也是一道面试题,java中,Override和Overload的区别. 一.方法重写(Override) 1.方法重写基本概念 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即

  • Java关键字this与super详解用法

    目录 一.this 关键字的使用 1. 概述 2. 作用 3. 使用 3.1 修饰属性和方法 3.2 调用构造器 3.3 返回当前对象 二.super关键字的使用 1. 概述 2. 使用 3. 使用 3.1 调用属性和方法 3.2 调用构造器 三.this和super的区别 四.子类对象实例化的全过程 一.this 关键字的使用 1. 概述 this是什么? 在Java中,this关键字比较难理解,它的作用和其词义很接近,表示“当前”的意思. 2. 作用 this关键字可以用来修饰.调用:属性.

随机推荐