sleep 和 wait 的区别?

这篇具有很好参考价值的文章主要介绍了sleep 和 wait 的区别?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 介绍

  sleep() : 是Thread类方法,用于使当前线程暂停执行一段时间。它可以被使用在多线程编程中,用于控制线程的执行速度或者创建时间延迟。

      参数:     long millis   : 参数表示线程休眠的毫秒数。 例如,如果调用Thread.sleep(1000),则当前线程会休眠 1000 毫秒(即 1 秒);

           int nanos    : 参数nanos表示要暂停的时间长度的额外部分,以纳秒为单位 ; 

  wait() :   是Object类的方法,让当前线程进入等待(阻塞)WAITTING 状态,将线程放入到等待队列中,并释放对象锁。

      参数   long timeout: 参数timeout(毫秒)时间后会被自动唤醒 ;

           int nanos    : 参数nanos表示额外时间(以毫微秒为单位,范围是 0-999999);wait(500, 50000),先执行5000毫微秒,执行结束后调用timeout执行。 

 

二. 代码展示

   public static void main(String[] args) {
        Object o = new Object();
        long start = System.currentTimeMillis();

        // 开启一个线程,线程内部使用wait() 方法 释放线程并让线程进入等待。
        new Thread(() -> {
            System.out.println("我是wait()线程");
            synchronized (o) {
                System.out.println("线程wait()等待将执行");
                try {
                    System.out.println("线程wait() 已释放");
                    o.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                long end = System.currentTimeMillis();
                System.out.println("线程wait()已唤醒,执行完毕,执行时间:" + (end - start));
            }
        }).start();

        //  开启一个线程,用于执行sleep()方法,使其线程暂时休眠。
        new Thread(() -> {
            System.out.println("我是Thread.sleep线程");
            synchronized (o) {
                System.out.println("线程Thread.sleep执行中");
                try {
                    Thread.sleep(5000);
                    o.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                long end = System.currentTimeMillis();
                System.out.println("线程Thread.sleep执行结束,用时" + (end - start));
            }
        }).start();

    }

  执行过程:

    - new 两个Thread线程类 ,通过start() 方法执行,开启抢占式;

    - 使用 synchronized 关键字,锁定执行线程。

    - 假设wait() 抢到线程调度,将会执行o.wait(); 释放该线程锁,进入等待状态,此时该线程不会自动唤醒,需要等待o.notify()或o.notifyAll() 方法,wait()线程才会重新进入就绪状态,准备获得对象锁进入运行状态 

    - Thread.sleep线程,会在o.wait() 方法执行后,获取到线权,执行Thread.sleep() 方法,该方法不会释放线程,会导致线程暂停执行,监控状态依然保持,在达到指定执行时间后会自动恢复。

    - Thread.sleep线程恢复后,将执行o.notify() 方法(当前线程不会马上释放该对象锁,要等到同步块或者同步方法执行完后,当前线程才会释放锁),唤醒 wait() 线程,顺序执行代码后结束;

    - wait()线程进入运行状态,顺序执行代码后结束。

 

三. 区别

  sleep:是指让当前线程暂停执行一段时间(即睡眠),然后再继续执行。在睡眠期间,线程会进入阻塞状态,不会占用CPU资源。sleep 的作用是为了暂停程序的执行,通常用于实现时间延迟的需求或控制程序的执行频率。

  wait:是指在多线程编程中,调用对象的某个方法,使当前线程等待,直到其他线程通知或满足特定条件时再继续执行。在调用 wait 方法后,当前线程会释放锁并进入等待状态,直到其他线程通过调用对象的 notify 或 notifyAll 方法来唤醒等待的线程。

  总结: sleep 是线程级别的操作,可以让当前线程暂停一段时间。

      wait 是对象级别的操作,使当前线程等待其他线程的通知或特定条件的满足。

   

四. 拓展

  1. 线程的状态:   

    创建状态: 当用new操作符创建一个线程的时候

     就绪状态: 调用start方法,处于就绪状态的线程并不一定马上就执行run方法,还需要等待CPU的调度。

    运行状态: CPU开始调度线程,并开始执行Run方法。

    阻塞状态: 线程的执行过程中可能因为一些原因进入阻塞状态,比如调用sleep方法,获取尝试得到一个等待。

    等待状态(Waiting): 使用notify、notifyAll、join方法唤醒。

    死亡状态: Run方法执行完成或者执行终于遇到异常。

 

  2. Thread.sleep(1000)  和 o.wait(1000) 的区别;

   两者参数均为1s,也就是多,两者执行都会等待1s,但有本质上的区别

   Thread.sleep() 在暂停期间,线程不会释放持有的任何锁或资源。一旦暂停时间结束,线程将被唤醒并可以重新参与竞争执行。

   wait()方法,必须在一个同步代码块或同步方法中,并且线程必须获取到对象的监视器锁。wait()方法调用后,线程进入等待状态并释放持有的监视器锁。其他线程可以进入该对象的同步代码块或同步方法,并对其进行操作。当满足某个条件时,或者超过最长等待时间后,线程将被唤醒并尝试重新获取监视器锁以继续执行

 

 

    文章来源地址https://www.toymoban.com/news/detail-554858.html

到了这里,关于sleep 和 wait 的区别?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 面试官:为什么有了sleep还需要wait?

    对于线程执行最大的问题就是随机调度,抢占式执行,对于程序猿来讲,是不喜欢这种随机性的,程序猿喜欢确定的东西,于是就有了一些方法,可以控制线程之间的执行顺序,虽然线程在内核里调度是随机的,但我们可以通过一些 api 让线程主动阻塞等待,主动放弃 CPU 给其

    2024年02月05日
    浏览(41)
  • java八股文面试[多线程]——sleep wait join yield

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

    2024年02月11日
    浏览(36)
  • selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait

    强制等待, sleep,设置等待多长时间,就要等待多长时间。等待完成后,才会继续下一步: 相比较于sleep的强制等待,selenium中还有种等待,可以称之为智能等待:implicitly_wait。所谓智能等待,就是在我设置的等待时间范围内,只要满足了我的条件,就会立即结束等待,继续

    2024年02月16日
    浏览(50)
  • selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()

    目录 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until()或者until_not()方法结合使用 WebDriverWait与expected_conditions结合使用 显示等待,自定义等待条件 设置固定休眠时间,单位为秒。 由python的time包提供, 导入 time 包后就可以使用。 缺点:不智能,使用太多的

    2024年02月16日
    浏览(29)
  • 单元测试使用Thread.sleep()后线程直接停止

    单元测试中测试多线程,使用sleep()阻塞线程,但是运行后发现Thread.sleep()后的代码不执行,直接退出了线程。 在单元测试中,如果子线程处于阻塞、死亡状态时,单元测试会立刻停止所有子线程。 如下图,不会输出running

    2024年02月13日
    浏览(34)
  • [.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试

    有个 Service 类,自己在内部实现 生产者/消费者 模式。即多个指令输入该服务后对象后, Service 内部有专门的消费线程执行传入的指令。每个指令的执行间隔为 1秒 。这里有两部分组成, 工作线程的载体。 new Thread 与 Task.Run 。 执行等待的方法。 Thread.Sleep 与 Task.Delay 。 cpu

    2024年02月09日
    浏览(26)
  • 【Java中的Thread线程的简单方法介绍和使用详细分析】

    提示:若对Thread没有基本的了解,可以先阅读以下文章,同时部分的方法已经在如下两篇文章中介绍过了,本文不再重复介绍!! 【Java中Tread和Runnable创建新的线程的使用方法】 【Java中的Thread线程的七种属性的使用和分析】 提示:以下是本篇文章正文内容,下面案例可供参

    2024年02月15日
    浏览(30)
  • PHP之sleep() 与 usleep() 的区别

    PHP中的 sleep() 和 usleep() 函数都是用于暂停脚本执行的函数,但它们之间有一些区别: sleep() 函数: sleep() 函数用于在脚本中暂停指定的秒数。它接受一个参数,表示需要暂停的秒数,可以是整数或浮点数。在调用 sleep() 函数后,脚本将被阻塞指定的时间,然后再继续执行下一

    2024年02月06日
    浏览(31)
  • C++ Sleep函数详细介绍与用法

    这个函数就是让程序挂起一段时间,或者说是让程序暂停一段时间。 这个函数需要头文件: 如果是Linux的话则需要 如果是Windows的话则需要 用法: 就是在Sleep()中写上要暂停的毫秒数。 注意: Sleep()中的第一个字母S是大写。 并且1000毫秒=1秒 样例: 它们都用来进行线程控制

    2024年02月14日
    浏览(37)
  • selenium Explicit 和 Implicit Waits区别

    The Selenium Browser Automation Project | Selenium Explicit and Implicit Waits Waiting is having the automated task execution elapse a certain amount of time before continuing with the next step. You should choose to use Explicit Waits or Implicit Waits. WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包