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

 更新时间:2021年04月29日 08:27:32   作者:小妮浅浅  
在本篇文章里小编给大家整理了一篇关于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()的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 结构化并发Structured Concurrency实践举例

    Java 结构化并发Structured Concurrency实践举例

    Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心目标为资源整合、依赖管理、异常控制,适用于复杂并发场景,未来将与JVM集成并扩展框架支持,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-09-09
  • 高吞吐、线程安全的LRU缓存详解

    高吞吐、线程安全的LRU缓存详解

    这篇文章主要介绍了高吞吐、线程安全的LRU缓存详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java将文件压缩成zip并下载

    Java将文件压缩成zip并下载

    这篇文章主要为大家详细介绍了Java如何将文件压缩成zip和下载,并处理base64和url,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2025-04-04
  • 认识Java底层操作系统与并发基础

    认识Java底层操作系统与并发基础

    这篇文章主要介绍了认识Java底层操作系统与并发基础,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • Java元素排序Comparable与Comparator的区别

    Java元素排序Comparable与Comparator的区别

    这篇文章主要介绍了Java元素排序Comparable与Comparator的区别,二者都是顶级的接口,但拥有的方法和用法是不同的,下面我们分别来看看具体是怎样的区别吧
    2022-05-05
  • 一文详解JDK21中虚拟线程

    一文详解JDK21中虚拟线程

    虚拟线程是JDK19中引入的,JDK21正式发布,本文主要介绍了JDK21中虚拟线程,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法

    这篇文章主要给大家介绍了关于JAVA深入探究之Method的Invoke方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • javaweb实战之商城项目开发(三)

    javaweb实战之商城项目开发(三)

    这篇文章主要针对javaweb商城项目开发进行实战演习,主要实现通用的BaseDao.java和使用resultMap映射关联对象,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Spring MVC拦截器的基本使用方法

    Spring MVC拦截器的基本使用方法

    这篇文章主要给大家介绍了关于Spring MVC拦截器的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring MVC具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    Spring容器的创建过程之如何注册BeanPostProcessor详解

    关于BeanPostProcessor 各位一定不陌生,今天整理的这篇文章总结了如何注册BeanPostProcessor,文中有非常详细的图文示例,需要的朋友可以参考下
    2021-06-06

最新评论