iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java中sleep方法和wait方法的五个区别
  • 568
分享到

java中sleep方法和wait方法的五个区别

2024-04-02 19:04:59 568人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录区别一:语法使用不同区别二:所属类不同区别三:唤醒方式不同区别四:释放锁资源不同sleep 不释放锁wait 释放锁区别五:线程进入状态不同总结前言: sleep 方法和 wai

前言:

sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应并中断,且都可以抛出 InterruptedException 异常,那 sleep 和 wait 有什么区别呢?接下来,我们一起来看。

区别一:语法使用不同

wait 方法必须配合synchronized 一起使用,不然在运行时就会抛出 IllegalMonitorStateException 的异常,如下代码所示: 

 初看代码好像没啥问题,编译器也没报错,然而当我们运行以上程序时就会发生如下错误: 

 而 sleep 可以单独使用,无需配合 synchronized 一起使用。

区别二:所属类不同

wait 方法属于 Object 类的方法,而 sleep 属于 Thread 类的方法,如下图所示: 

区别三:唤醒方式不同

sleep 方法必须要传递一个超时时间的参数,且过了超时时间之后,线程会自动唤醒。而 wait 方法可以不传递任何参数,不传递任何参数时表示永久休眠,直到另一个线程调用了 notify 或 notifyAll 之后,休眠的线程才能被唤醒。也就是说 sleep 方法具有主动唤醒功能,而不传递任何参数的 wait 方法只能被动的被唤醒

区别四:释放锁资源不同

wait 方法会主动的释放锁,而 sleep 方法则不会。接下来我们使用代码的方式来演示一下二者的区别。

sleep 不释放锁

接下来使用 sleep 是线程休眠 2s,然后在另一个线程中尝试获取公共锁,如果能够获取到锁,则说明 sleep 在休眠时会释放锁,反之则说明不会释放锁,实现代码如下:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    new Thread(() -> {
        synchronized (lock) {
            System.out.println("新线程获取到锁:" + LocalDateTime.now());
            try {
                // 休眠 2s
                Thread.sleep(2000);
                System.out.println("新线程获释放锁:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    // 等新线程先获得锁
    Thread.sleep(200);
    System.out.println("主线程尝试获取锁:" + LocalDateTime.now());
    // 在新线程休眠之后,尝试获取锁
    synchronized (lock) {
        System.out.println("主线程获取到锁:" + LocalDateTime.now());
    }
}

以上代码的执行结果如下图所示: 

 从上述结果可以看出,在调用了 sleep 之后,在主线程里尝试获取锁却没有成功,只有 sleep 执行完之后释放了锁,主线程才正常的得到了锁,这说明 sleep 在休眠时并不会释放锁。

wait 释放锁

接下来使用同样的方式,将 sleep 替换成 wait,在线程休眠之后,在另一个线程中尝试获取锁,实现代码如下:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    new Thread(() -> {
        synchronized (lock) {
            System.out.println("新线程获取到锁:" + LocalDateTime.now());
            try {
                // 休眠 2s
                lock.wait(2000);
                System.out.println("新线程获释放锁:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
    // 等新线程先获得锁
    Thread.sleep(200);
    System.out.println("主线程尝试获取锁:" + LocalDateTime.now());
    // 在新线程休眠之后,尝试获取锁
    synchronized (lock) {
        System.out.println("主线程获取到锁:" + LocalDateTime.now());
    }
}

以上代码的执行结果如下图所示: 

 从上述结果可以看出,当调用了 wait 之后,主线程立马尝试获取锁成功了,这就说明 wait 休眠时是释放锁的。

区别五:线程进入状态不同

调用 sleep 方法线程会进入 TIMED_WAITING 有时限等待状态,而调用无参数的 wait 方法,线程会进入 WAITING 无时限等待状态 

代码演示:

public static void main(String[] args) throws InterruptedException {
    Object lock = new Object();
    Thread t1 = new Thread(() -> {
        synchronized (lock) {
            try {
                // 休眠 2s
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
    t1.start();

    Thread t2 = new Thread(() -> {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
    t2.start();

    Thread.sleep(200);
    System.out.println("wait() 之后进入状态:" + t1.getState());
    System.out.println("sleep(2000) 之后进入状态:" + t2.getState());

}

以上代码的执行结果如下:

总结

sleep 和 wait 都可以让线程进入休眠状态,并且它们都可以响应 interrupt 中断,但二者的区别主要体现在:语法使用不同、所属类不同、唤醒方式不同、释放锁不同和线程进入的状态不同。​

到此这篇关于java中sleep方法和wait方法的五个区别的文章就介绍到这了,更多相关sleep 和wait方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java中sleep方法和wait方法的五个区别

本文链接: https://www.lsjlt.com/news/148349.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中sleep方法和wait方法的五个区别
    目录区别一:语法使用不同区别二:所属类不同区别三:唤醒方式不同区别四:释放锁资源不同sleep 不释放锁wait 释放锁区别五:线程进入状态不同总结前言: sleep 方法和 wai...
    99+
    2024-04-02
  • Java中sleep和wait方法有什么区别
    本篇内容主要讲解“Java中sleep和wait方法有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中sleep和wait方法有什么区别”吧!一、sleep和wait方法的区别根...
    99+
    2023-06-30
  • Java详细分析sleep和wait方法有哪些区别
    目录一、sleep和wait方法的区别二、wait方法wait方法的使用wait结束等待的条件三、notify和notifyAll方法一、sleep和wait方法的区别 根本区别:s...
    99+
    2024-04-02
  • java中sleep()和wait()有什么区别
    这篇文章主要介绍java中sleep()和wait()有什么区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统...
    99+
    2023-06-14
  • java中sleep()和wait()的区别有哪些
    这篇文章主要介绍java中sleep()和wait()的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;...
    99+
    2023-06-14
  • java中wait和sleep的区别是什么
    在Java中,`wait()`和`sleep()`是两个不同的方法,用于不同的场景。1. `wait()`: `wait()`是Ob...
    99+
    2023-08-08
    java wait sleep
  • java sleep()和wait()的区别点总结
    1、区别说明 wait()是Object的方法,sleep()是Thread的方法。 wait()必须采用同步方法,不需要sleep()方法。 线程在同步方法中执行sleep()方法...
    99+
    2024-04-02
  • 在Java中sleep()和wait()有什么区别
    Java中sleep()和wait()的区别:sleep()是线程类的静态方法,而wait()是Object类的方法。Sleep()可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断,而Wait()可以...
    99+
    2024-04-02
  • java之sleep和wait的区别是什么
    sleep是Thread类的静态方法,而wait是Object类的实例方法。 sleep方法会让当前线程暂停执行一段时间,不会释放...
    99+
    2024-03-08
    java
  • java线程sleep和wait的区别有哪些
    Java中的线程sleep和wait方法有以下区别:1. 调用wait方法的线程会放弃自己的锁,并进入等待状态,直到其他线程调用相同...
    99+
    2023-09-25
    java
  • Java中wait与sleep的区别讲解(wait有参及无参区别)
    目录1. wait() 与wait( long timeout ) 区别2. wait(0) 与 sleep(0)区别3. wait 和sleep 释放代码4. wait 与 sle...
    99+
    2024-04-02
  • Java中方法重写和方法重载的6个区别
    一、定义 方法重载(Overloading):在同一个类中,方法名相同但参数类型、参数个数不同的方法之间的关系。 方法重写(Overriding):在子类中,有相同的方法名、参数类型、参数个数并且返回类型兼容的方法称之为...
    99+
    2023-10-29
    方法 重写 区别
  • 详解Java中方法重写和方法重载的6个区别
    目录1.方法重写1.1 基本用法1.2 使用场景1.3 注意事项2.方法重载2.1 基本使用2.2 使用场景2.3 注意事项3.方法重写 VS 方法重载总结方法重写(Override...
    99+
    2024-04-02
  • java 中 orElse 和 orElseGet 方法区别
    orElse 和 orElseGet 是 Optional 类的两个方法,用于处理可能为空的值。 区别 orElse 方法: orElse 方法接受一个默认值作为参数,并在 Optional 对象为空...
    99+
    2023-10-18
    java 开发语言
  • 详解java中List中set方法和add方法的区别
    目录前言相同点不同点总结前言 在Java中的常用的集合接口List中有两个非常相似的方法: E set(int index, E element); void add(int ind...
    99+
    2022-11-13
    java List中set和add区别 java set add区别
  • C#中Abstract方法和Virtual方法的区别
    简介: c#中Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用。virtual可以被子类重写,而abstract必须被子类重写。virtua...
    99+
    2024-04-02
  • java中yield()和sleep()的区别有哪些
    这篇文章将为大家详细讲解有关java中yield()和sleep()的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Androi...
    99+
    2023-06-15
  • Java线程中的sleep方法详解
    在Java线程中,sleep方法是一个线程的静态方法,用于暂停当前线程的执行一段时间。sleep方法的语法如下:```javapub...
    99+
    2023-09-14
    Java
  • java中wait方法怎么使用
    在Java中,wait()方法是Object类的一个方法,用于使当前线程进入等待状态,直到其他线程调用notify()或notify...
    99+
    2023-09-16
    java
  • java中timer的schedule和scheduleAtFixedRate方法区别详解
    timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上。 我们来举个例子:暑假到了老师给schedule和sched...
    99+
    2023-05-30
    java timer schedule
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作