Thread之二:sleep、wait、yield、join
《Thread之二:sleep、wait、yield、join》
一、回顾下概念
1.sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2.wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite() 和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生 IllegalMonitorStateException的异常。
3.yield方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
4.join方法
等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
二、线程同步
- Thread类的方法:sleep(),yield()等
- Object的方法:wait()和notify()、notifyAll()等
Object中的对象头存放的锁信息在控制同步访问时使用。见《java对象在内存中的结构(HotSpot虚拟机)》和《Synchronized之二:synchronized的实现原理》
sleep()与wait()的共同点及不同点:
共同点: 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
不同点: Thread.sleep(long)可以不在synchronized的块下调用,而且使用Thread.sleep()不会丢失当前线程对任何对象的同步锁(monitor);
object.wait(long)必须在synchronized的块下来使用,调用了之后失去对object的monitor, 这样做的好处是它不影响其它的线程对object进行操作。
举个java.util.Timer的例子来说明。
private void main Loop() {
while (true) {
....
synchronized(queue) {
.....
if (!taskFired) // Task hasn't yet fired; wait
queue.wait(executionTime - currentTime);
}
}
在这里为什么要使用queue.wait(),而不是Thread.sleep(), 是因为暂时放弃queue的对象锁,可以让允许其它的线程执行一些同步操作。如:
private void sched(TimerTask task, long time, long period) {
synchronized(queue) {
...
queue.add(task);
}
}
但是正如上篇文章讲到的,使用queue.wait(long)的前提条件是sched()动作执行的时间很短,否则如果很长,那么queue.wait()不能够按时醒来。
最新文章
- hybrid app 简介
- MongoDB创建用户
- NeHe OpenGL教程 第三十九课:物理模拟
- oracle计算年龄
- 贝塞尔曲线算法,js贝塞尔曲线路径点
- [置顶] 让你的Android应用与外部元素互动起来
- BZOJ 3233: [Ahoi2013]找硬币( dp )
- 远景面试算法题——FolderSize
- 搭建lnmp教程
- cesium编程入门(一)cesium简介
- java 多线程(总结)
- Python——三级菜单
- 同时使用多个JDK版本的方法
- systemd服务详解-技术流ken
- writing objects : 值%停住
- Spring-Boot Banner
- java设置字符串编码、转码
- 170823、SQL Update多表联合更新的方法
- Actual Time Cost
- 工作log
热门文章
- java性能监控工具jstat-windows
- SQL获取年月日方法
- CUDA vs GPGPU
- IOS AFNETWORKING POST
- Linux内核RCU(Read Copy Update)锁简析
- 腾讯云centos,nginx安装
- WPF中的数据绑定Data Binding使用小结
- 九度OJ 1133:学分绩点 (加权平均数)
- go echo studygolang ___go_build_myT_go__1_.exe
- 对于js里的闭包的理解