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