美文网首页安卓面试宝典Java面试程序员
【Thread】Thread中sleep() 、wait()、

【Thread】Thread中sleep() 、wait()、

作者: itbird01 | 来源:发表于2017-03-16 11:16 被阅读182次

    近期在深入学习多线程相关的知识过程中,发现很有必要对Thread中几个重点方法的用法以及相互之间的区别进行总结一下,包含sleep() 、wait()、 yield()、 join(),接下来我们基于几点来深入学习。

    1.sleep() 、wait()、 yield()、 join()各自的用法以及方法说明

    2.sleep()  and wait()方法区别(Demo实践)

    3.join()方法(Demo实践)

    Demo

    1.sleep() 、wait()、 yield()、 join()各自的用法以及方法说明

    1.1 sleep()

    sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态,但不会释放“锁标志”,不推荐使用。

    1.2 wait()

    在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

    1.3 yield()

    暂停当前正在执行的线程对象。

    yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

    yield()只能使同优先级或更高优先级的线程有执行的机会。

    1.4 join()

    等待调用join方法的线程结束,再继续执行。

    Rxjava+Retrofit:通过Gradle导入即可

    2.sleep()  and wait()方法区别(Demo实践)

    在调用sleep()方法的过程中,线程不会释放对象锁,而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

    demo源码

    运行结果截图:

    运行结果截图

    由运行结果截图可知,thread1在进入运行状态并调用ThreadStateMainClass.class.wait()之后,线程会放弃对象锁,进入等待此对象的等待锁定池,所以thread2开始运行,thread2调用过程中,调用了sleep函数,sleep过程中会一直持有锁,sleep完成后调用了notify,thread1开始获取到对象锁,并开始继续运行

    总结:

    (1)sleep是针对于thread对象,wait是针对于Object对象

    (2)在调用sleep()方法的过程中,线程不会释放对象锁,而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。

    3.join()方法(Demo实践)

    新建一个thread1,在主线程运行过程中,调用thread1的join方法,查看运行结果

    join测试代码

    运行结果截图:

    Demo运行结果截图

    由Demo运行结果可知,主线程运行过程中调用了thread1的join方法之后,主线程一直等待thread1运行结束,才继续回到主线程的运行过程中来

    相关文章

      网友评论

        本文标题:【Thread】Thread中sleep() 、wait()、

        本文链接:https://www.haomeiwen.com/subject/vuudnttx.html