【Thread】Thread中sleep() 、wait()、 yield()、 join()用法与区别

近期在深入学习多线程相关的知识过程中,发现很有必要对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运行结束,才继续回到主线程的运行过程中来

4.线程的几种状态

线程的五大状态为:New、Runnable、Running、Blocked、Dead,而他们之间有者千丝万缕的关系,为了便于大家理解,看图说话

线程状态图

很多人会问,为什么有这么多Blocked?

(1)新建状态(New):新创建了一个线程对象。

(2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

(3)运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

(4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

不管线程进入哪种阻塞状态,都得等所等待的事件(wait、sleep、join、synchronized、I/O)完成后,才可以进入就绪队列,排队等待CPU资源

(5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,503评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,987评论 1 18
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 4,792评论 12 45
  • sleep(),wait(),join(),yield(),interrupt()方法简介 sleep()是Thr...
    向日花开阅读 873评论 0 6
  • 我们是别人生命中的过客,别人也是我们生命中的过客。没有什么是永恒。那些说要爱一辈子的人,爱着爱着也就不爱了。那些说...
    小七1717阅读 203评论 0 0