多线程同步中sleep与wait区别
来源:互联网 发布:c 编程程序 编辑:程序博客网 时间:2024/04/29 18:11
1、函数
wait是Object的一个函数,指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(这两个也是Object的函数)。
sleep则是Thread的一个函数,指线程被调用时,占着CPU不工作.此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
sleep(100L)意思为:占用CPU,线程休眠100毫秒
wait(100L)意思为:不占用CPU,线程等待100毫秒
注意:wait和sleep最终都是调用native函数。
2、多线程
使用多线程就没法绕过同步问题,而wait和sleep对于同步锁也有不同的效果
(1)在使用上,调用obj的wait和notify函数前必须获取对象锁,即在synchronized(obj){...}代码块中。
(2)如果都在synchronized代码块中,wait(obj)函数可以释放锁,而sleep函数则不释放锁。
在wait释放锁这里有一个场景:
有两个线程A和B,在A线程中有如下代码:
synchronized(mLock){
...
mLock.wait();
...
}
这样在synchronized处获取对象锁,当执行到wait函数时,线程A进入等待状态,并且释放对象锁。
在B线程中有如下代码:
synchronized(mLock){
...
mLock.notify();
...
}
当A的wait函数释放锁时,B线程的synchronized获取了对象锁,开始执行代码。
当执行到notify函数时,唤醒A线程。但是这时由于B的synchronized代码块未执行完,所以未释放锁。所以先执行B线程notify后面的代码,B的synchronized代码执行完后释放锁,A线程获取锁并执行wait之后的代码。
(注意,如果有多个wait状态的obj,notify函数只能唤醒其中一个,是由JVM决定的,而notifyAll可以唤醒所有的)
测试代码如下:
Thread a = new Thread(new Runnable() { @Override public void run() { synchronized (mLock){ Log.e("sss", "a 1"); try { mLock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("sss", "a 2"); } }});Thread b = new Thread(new Runnable() { @Override public void run() { synchronized (mLock){ Log.e("sss", "b 1"); try { mLock.notify(); } catch (Exception e) { e.printStackTrace(); } Log.e("sss", "b 2"); } }});a.start();b.start();
打印日志如下:
12-14 18:50:12.909 22793-22824/com.example.testapplication E/sss: a 1
12-14 18:50:12.909 22793-22825/com.example.testapplication E/sss: b 1
12-14 18:50:12.909 22793-22825/com.example.testapplication E/sss: b 2
12-14 18:50:12.909 22793-22824/com.example.testapplication E/sss: a 2
阅读全文
0 0
- 多线程同步中sleep与wait区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别
- Java多线程中Sleep与Wait的区别?
- Java多线程中Sleep与Wait的区别
- java中多线程(1)之sleep与wait的区别
- java多线程 wait与sleep的区别
- 多线程中sleep()和wait()的区别
- Java多线程中sleep,wait区别
- java多线程中yield(),sleep(),wait()区别
- 多线程中 wait和sleep的区别
- java多线程三种方式区别,java多线程,线程同步方式,线程同步加锁的方法,wait与sleep区别
- Java中sleep()与wait()的区别
- java 中sleep 与 wait 的区别
- Java中sleep() 与wait()的区别
- java面试题目
- JAVA 爬虫之httpclient post请求提交表单获取Ajax数据
- JavaScript数组
- Ubuntu安装.run文件
- 为什么要做 word embedding
- 多线程同步中sleep与wait区别
- cesium学习记录(-)- 可视化空间数据Entity入门基础
- Hibernate.initialize延迟加载,以及CallBack回调怎么用?
- ajax格式
- Qt教程十四步
- 子网掩码计算器java源码
- 每周好书推荐《那些古怪又令人忧心的问题》
- springmvc+ mybatis 整合cms内容发布平台
- Filter入门介绍