Android ConditionVariable
2016-07-29 17:49
447 查看
Android -- ConditionVariable
obj.wait() obj.notify() 的方式 notify先调, wait 会一直等待线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。
void block() //阻塞当前线程,直到条件为open void block(long timeout) //阻塞当前线程,直到条件为open或超时 void open() //释放所有阻塞的线程 void close() //将条件重置为close
ConditionVariable 在创建时还有一种构造方法是 public ConditionVariable (boolean state) ,如果为true,默认时为opened,如果为false则是closed. ,默认public ConditionVariable()为closed.
源码
其实很好理解private volatile boolean mCondition;
成员内部变量。
//默认构造函数 public ConditionVariable() { mCondition = false; }
public ConditionVariable(boolean state) { mCondition = state; }
open,释放阻塞,即notifyAll一下,此时成员变量变为true。
public void open() { synchronized (this) { boolean old = mCondition; mCondition = true; if (!old) { this.notifyAll(); } } }
close,重置成员变量为false
public void close() { synchronized (this) { mCondition = false; } }
block,只有在成员变量为false的时候进行wait等待
public void block() { synchronized (this) { while (!mCondition) { try { this.wait(); } catch (InterruptedException e) { } } } }
public boolean block(long timeout) { // Object.wait(0) means wait forever, to mimic this, we just // call the other block() method in that case. It simplifies // this code for the common case. if (timeout != 0) { synchronized (this) { long now = System.currentTimeMillis(); long end = now + timeout; while (!mCondition && now < end) { try { this.wait(end-now); } catch (InterruptedException e) { } now = System.currentTimeMillis(); } return mCondition; } } else { this.block(); return true; } }
code
简单的延时:new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(isStart) { //延时等待3秒 mConditionVariable.block(3000); //将条件重置,否则block会失效 mConditionVariable.close(); //线程唤醒后通知主线程
mHandler.sendEmptyMessage(REFRESHTEXT); } } }).start();
相关文章推荐
- Android 内存优化 查找问题所在
- Android WindowManager窗口类型
- Android学习之手电筒程序(兼容6.0系统)
- Android Studio 包冲突的解决方法
- Android Studion 中java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader
- Android碎知识点总结
- Android Studio教程从入门到精通
- Android自定义View之画笔与画布
- Android内存泄漏的八种可能
- Android Studio 中Manifest merger failed : uses-sdk:minSdkVersion 1 cannot be smaller than version 7
- No command 'mmm' found
- 倒计时
- Android Studio Error:Execution failed for task ':xxxxx:mergeDebugResources'
- Android Studio 删除module
- Android-从音频文件中获取专辑图片
- Retrofit – Java(Android) 的REST 接口封装类库
- 利用JXL包处理Excel表格
- Android Studio中如何设置注释模板(针对file)
- 七、广告和启动页
- android activity启动模式笔记