Java面试题篇之Sleep()方法与Wait()方法的区别详解

 更新时间:2024年07月23日 08:55:28   作者:guicai_guojia  
这篇文章主要给大家介绍了关于Java面试题篇之Sleep()方法与Wait()方法区别的相关资料,wait()是Object类中的方法,而sleep()是Thread类中的静态方法,wait()方法用于多个线程之间的协作和通信,而sleep()方法用于线程的休眠,需要的朋友可以参考下

在 Java 中,sleep() 和 wait() 方法都可以用来控制线程的执行顺序或等待特定条件的发生,但它们有着不同的使用场景和行为:

1. sleep()

- sleep() 方法来自于 Thread 类,用于让当前线程暂停执行一段时间,以毫秒为单位。

- 调用 sleep() 方法会让线程进入阻塞状态,但不会释放锁。

- 通常用于模拟时间间隔、节流处理、或者简单的等待。

示例用法:

try {
    Thread.sleep(1000); // 暂停当前线程1秒钟
} catch (InterruptedException e) {
    e.printStackTrace();
}

sleep() 方法是一个本地方法(native method),它会调用操作系统提供的功能来使当前线程休眠指定的毫秒数。

当调用 sleep() 方法时,当前线程会进入 TIMED_WAITING 状态,直到指定的时间到达或者被中断(InterruptedException)。

public static native void sleep(long millis) throws InterruptedException;

2. wait()

- wait() 方法来自于 Object 类,用于在多线程环境下实现线程间的协调与通信。

- 调用 wait() 方法会让线程释放对象锁,并且进入等待状态,直到其他线程调用相同对象上的 notify() 或 notifyAll() 方法来唤醒它,或者等待时间到达。

- 必须在同步块或同步方法中调用 wait() 方法,否则会抛出 IllegalMonitorStateException 异常。

示例用法:

synchronized (sharedObject) {
    while (!condition) {
        try {
            sharedObject.wait(); // 等待直到条件满足
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

wait() 方法的不同重载允许在等待时设置超时时间。

当调用 wait() 方法时,当前线程释放对象的锁,并进入 WAITING 或者 TIMED_WAITING 状态,直到被其他线程调用相同对象的 notify() 或 notifyAll() 方法唤醒,或者等待超时。

public final void wait() throws InterruptedException {
    wait(0);
}

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
    if (timeout < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }
    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException("nanosecond timeout value out of range");
    }
    if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
        timeout++;
    }

    wait(timeout);
}

区别总结

- 来源与使用对象:

  - sleep() 是 Thread 类的静态方法,用于让当前线程休眠一段时间。

  - wait() 是 Object 类的方法,用于线程间的协调和通信。

- 锁的释放:

  - sleep() 不会释放锁,线程仍然持有锁。

  - wait() 会释放对象锁,让其他线程可以访问这个对象的同步方法或块。

- 唤醒机制:

  - sleep() 时间到达或者被中断时会自动唤醒。

  - wait() 需要其他线程调用相同对象的 notify() 或 notifyAll() 方法来唤醒。

- 异常处理:

  - sleep() 方法的中断异常是 InterruptedException。

  - wait() 方法的中断异常也是 InterruptedException,但是在 wait() 中使用时,建议使用循环检查条件来避免虚假唤醒。

总结

sleep() 用于线程暂停执行一段时间,适用于控制时间间隔;wait() 用于多线程间的协调和通信,适用于等待特定条件的发生。在使用时需要根据具体场景选择合适的方法,并理解它们的不同行为和特点。

到此这篇关于Java面试题篇之Sleep()方法与Wait()方法区别的文章就介绍到这了,更多相关Java Sleep()方法与Wait()方法的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot引入druid解析sql的过程

    springboot引入druid解析sql的过程

    在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析,需要的朋友可以参考下
    2023-08-08
  • Java SPEL表达式注入漏洞原理解析

    Java SPEL表达式注入漏洞原理解析

    SpEL简称Spring表达式语言,在Spring 3中引入,SpEL能在运行时构建复杂表达式、存取对象图属性、对象方法调用等等,可以与基于XML和基于注解的Spring配置还有bean定义一起使用,本文给大家介绍Java SPEL表达式注入漏洞原理研究,感兴趣的朋友一起看看吧
    2023-10-10
  • Java中clone方法使用笔记

    Java中clone方法使用笔记

    clone顾名思义是复制,在Java语言中,clone方法被对象调用,所以会复制对象,下面这篇文章主要给大家介绍了关于Java中clone方法使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Spring解读@Component和@Configuration的区别以及源码分析

    Spring解读@Component和@Configuration的区别以及源码分析

    通过实例分析@Component和@Configuration注解的区别,核心在于@Configuration会通过CGLIB代理确保Bean的单例,而@Component不会,在Spring容器中,使用@Configuration注解的类会被CGLIB增强,保证了即使在同一个类中多次调用@Bean方法
    2024-10-10
  • Springboot+devtools配置热部署过程

    Springboot+devtools配置热部署过程

    SpringBoot提供的spring-boot-devtools模块可以实现应用的热部署,极大提升开发效率,通过添加POM依赖、配置yml文件、使用IDE快捷键等步骤,可以无需手动重启即可自动加载变更,这种方式不仅适用于静态文件的自动加载,也适用于整个SpringBoot工程,是提高开发效率的有效手段
    2024-11-11
  • SpringBoot监控API请求耗时的6中解决解决方案

    SpringBoot监控API请求耗时的6中解决解决方案

    本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+Prometheus,具有一定的参考价值,感兴趣的可以了解一下
    2025-07-07
  • 详解Spring-Boot中如何使用多线程处理任务

    详解Spring-Boot中如何使用多线程处理任务

    本篇文章主要介绍了详解Spring-Boot中如何使用多线程处理任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 实例讲解Java中random.nextInt()与Math.random()的基础用法

    实例讲解Java中random.nextInt()与Math.random()的基础用法

    今天小编就为大家分享一篇关于实例讲解Java中random.nextInt()与Math.random()的基础用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 在spring中使用自定义注解注册监听器的方法

    在spring中使用自定义注解注册监听器的方法

    本篇文章主要介绍了在spring中使用自定义注解注册监听器的方法,本文就是在分析监听器回调原理的基础上,在spring环境中使用自定义的注解实现一个监听器。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 内存屏障由来及实现思路

    内存屏障由来及实现思路

    这篇文章主要为大家详细介绍了内存屏障由来及实现思路的详细讲解,让大家彻底的理解内存屏障,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01

最新评论