• 19.wait与sleep的区别



    waitsleep的区别

     引言

    本节介绍wait方法与sleep方法的区别,一共有7件不同,第一点位置,

    第二点,是否需要当前线程拥有锁

    第三点,是否支持手动唤醒。

    第四点是否支持自动唤醒。

    第五点是否支持中断。

    第六点,是否释放锁

    第七点,线程状态。

     位置

    首先来看第一点位置,sleep方法是线程方法,它位于thread内里面,而wait方法是锁方法,它位于object类里面,

    这里展示的是sleep方法锁处的位置以及方法个数。

    同样的这里展示的是wait方法锁处的位置以及方法个数。

     第二点

    下面再来看第二点,是否需要当前线程拥有锁,调用sleep方法时,不需要当前线程拥有锁而调用wait方法时,则需要当前线程拥有锁。


    现在看
    sleep方法实例,这里使当前线程休眠一秒钟,

    从执行结果来看,调用sleep方法时,它不需要当前线程拥有锁。

    再来看wait方法实例,这里使当前线程等待。

    从执行结果来看,若当前线程没有拥有锁程序则会发生异常,

    所以我们需要在同步中调用wait方法,让线程获取锁。

    从执行结果来看,线程被等待没有引发异常。

     支持手动唤醒

    下面再来看第三点,是否支持手动唤醒?

    sleep方法不支持手动唤醒,而wait方法是支持手动唤醒的,

    支持的方法有 notify,notifyall由于sleep方法不支持手动唤醒,所以这里就不再演示它了。 


    下面只演示
    wait方法的实例,自定义一个任务,任务内容,就是使当前线程等待,等待之后,输出一句话执行该任务,并调用锁对象task的notify和notifyall方法唤醒线程。

    从执行结果来看,线程等待一秒后被唤醒。

     是否支持自动唤醒

    下面再来看第四点,是否支持自动唤醒,两个方法都支持自动唤醒,都可以指定超时时间。

    先来看sleep方法实例,这里使当前线程休眠一秒钟。

    从执行结果来看,程序经过一秒钟之后输出该内容。

     


    再来看
    wait方法实例,这里使当前线程等待并指定超时时间为一秒钟。

    从执行结果来看,程序经过一秒钟之后输出该内容。

     是否支持中断

    下面我们来看第五点,是否支持中断。sleep方法和wait方法都支持中断,也就是支持interrupt方法,只不过他们被中断以后都会发生线程中断异常。

    下面来看一下示例代码。首先来看sleep方法实例,制定一个任务,任务内容就是使当前线程休眠一秒钟,

    然后执行该任务,接着中断执行任务的线程。从执行结果来看,线程休眠后立马被中断并引发了异常。

    再来看wait方法实例,任务内容变成了使当前线程等待执行任务的步骤不变。下面来看看执行结果。 


    从执行结果来看,线程等待后立马被中断,并引发了线程中断异常。

     是否释放锁

    下面我们来看第六点,是否释放锁?这里说的是当方法被调用时,此时锁是否被释放?

    sleep方法被调用时不会释放速,而wait方法被调用时会立即释放锁。

    先来看看sleep方法实例,制定一个任务,任务内容是使当前线程休眠三秒钟,

    然后去执行该任务,这里使主线程去争夺thread的线程的锁。

    从执行结果来看,三秒后内容才被输出,说明调用sleep方法时不会释放锁。 


    再来看
    wait方法实例,任务内容变成使当前线程等待,其他的不变。

    从执行结果来看,内容立马被输出,说明调用wait方法会立即释放速。

    线程状态

    下面我们再来看最后一点,线程状态,sleep方法它只有一种状态,timed_waiting,而wait方法它有两种状态,waiting和timed_waiting

    为什么wait会有两种状态?因为wait一共有三个方法,其中第一个方法是手动唤醒,其余两个是超时自动唤醒,前者的线程状态是waiting,后者线程的状态是timed_waiting。 


    先来看
    sleep方法实例,任务还是使当前线程休眠三秒钟,执行任务。

    下面来看看执行结果。从执行结果来看,休眠中的线程,它的状态是timed_waiting,

    再来看看wait的方法实例,它有两种现成状态,现在演示第一种线程状态,任务内容变成使当前线程等待其他的不变。

    下面来看一下执行结果,从执行结果来看,等待中的线程它的状态是waiting。

    再看wait的第二种状态测试,等待超时时间为三秒钟,其他的不变。

    下面来看一下执行结果。从执行结果来看,超时等待中的线程他的状态是timed_waiting。 

     总结


    最后我们来总结一下本节的内容。本节介绍了
    wait方法和sleep方法的区别,总结了7点不同,这里就不再赘述了。大家可以截屏保存,以供日后使用。 


      

    附录:

    笔记完整文本:

    本节介绍wait方法与sleep方法的区别,一共有7件不同,第一点位置,第二点,是否需要当前线程拥有锁第三点,是否支持手动唤醒。第四点是否支持自动唤醒。第五点是否支持中断。第六点,是否释放锁第七点,线程状态。首先来看第一点位置,sleep方法是线程方法,它位于thread内里面,而wait方法是锁方法,它位于object类里面,这里展示的是sleep方法锁处的位置以及方法个数。同样的这里展示的是位置方法锁处的位置以及方法个数。下面再来看第二点,是否需要当前线程拥有锁调用sleep方法时,不需要当前线程拥有锁而调用wait方法时,则需要当前线程拥有锁。 现在看sleep方法实例,这里使当前线程休眠一秒钟,从执行结果来看,调用sleep方法时,它不需要当前线程应用锁。再来看wait方法实例,这里使当前线程等待。从执行结果来看,若当前线程没有拥有锁程序则会发生异常,锁以我们需要在同步中调用wait方法,让线程获取锁。从执行结果来看,线程被等待没有引发异常。下面再来看第三点,是否支持手动唤醒?sleep方法不支持手动唤醒,而wait方法是支持手动唤醒的,支持的方法有 notify notify all由于sleep方法不支持手动换鞋,锁以这里就不再掩饰它了。 下面直言是wait方法的实力,自定义一个任务任务内容,就是使当前线程等待等待之后,说出一句话执行该任务,并调用锁对象task的裸体百货note方法唤醒线程。从执行结果来看,线程等待一秒后被唤醒。下面再来看第四点,是否支持自动唤醒,两个方法都支持自动唤醒,都可以指定超时时间。先来看sleep方法实例,journey使当前线程休眠一秒钟。从执行结果来看,程序经过一秒钟之后输出该内容。 再来看weight方法实例,这里使当前线程等待并指定超时时间为一秒钟。从执行结果来看,程序经过一秒钟之后输出该内容。下面我们来看第五点,是否支持中断。sleep方法和外头方法都支持中断,也就是支持interrupt方法,只不过他们被中断以后都会发生线程中断异常。下面来看一下示例代码。首先来看clip,方法实例制定一个任务任务内容就是使当前线程休眠一秒钟,然后执行该任务接着中断执行任务的线程。从执行结果来看,线程休眠后立马被中断并引发了异常。再来看wait方法,实例任务内容变成了使当前线程等待执行任务的步骤不变。下面来看看执行结果。 从执行结果来看,线程等待后立马被中断,并引发了线程中断异常。下面我们来看第六点,是否释放素?这里说的是当方法被调用时,此车速是否被释放?sleep方法被调用时不会释放速,而wait方法被调用时会立即释放锁。先来看看sleep方法实力,制定一个任务任务内容是使当前线程休眠三秒钟,然后去执行该任务,这里使主线程去争夺three的线程的数。从执行结果来看,三美后内容才被输出,说明调用死女子方法时不会是放手。 再来看wait方法,实例任务内容变成使当前线程等待其他的不变。从执行结果来看,内容立马被输出,说明调用wait方法会立即释放速。下面我们再来看最后一点,线程状态,斯林福方法它只有一种状态,time、点weight,而wait方法它有两种状态,waiting和time的vt为什么wait会有两种状态?因为wait一共有三个方法,其中第一个方法是手动唤醒,其余两个是超时自动唤醒,前者的现成状态是v庭,或者线程的状态是time微停。 先来看sleep方法实例,任务还是使当前线程休眠三秒钟,这些任务。下面来看看执行结果。从执行结果来看,秋眠中的线程他在装的是他们的vt再来看看胃的方法实力,它有两种现成状态,现在也是第一种限制状态,任务内容变成使当前线程等待其他的不变。下面来看一下执行结果,从执行结果来看,等待中的线程它的状态是waiting。再看wait的第二种状态测试,等待超时时间为三秒钟,其他的不便。下面来看一下执行结果。从执行结果来看,超时等待中的先生他的状态是time的waiting。 最后我们来总结一下本节的内容。本节介绍了wait方法和sleep方法的区别,总结了7点不同,这里就不再赘述了。大家可以截屏保存,一共日后食用。

     

  • 相关阅读:
    mysql索引最左匹配的理解(转载于知乎回答)
    mysql深度优化与理解(迄今为止读到最优秀的mysql博客)
    PHP数组函数总结与使用
    进程(process)和线程(thread)
    联合索引使用规则(转载)
    mysql优化大全(转自别人 )
    HTTP隧道解决的问题
    HTTP代理协议 HTTP/1.1的CONNECT方法
    vant弹窗提示
    vue获取验证码倒计时
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16086051.html
Copyright © 2020-2023  润新知