安卓面试宝典Java面试程序员

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

2017-03-16  本文已影响182人  itbird01

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

上一篇下一篇

猜你喜欢

热点阅读