博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android -- ConditionVariable
阅读量:6547 次
发布时间:2019-06-24

本文共 2435 字,大约阅读时间需要 8 分钟。

线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。

void block()//阻塞当前线程,直到条件为openvoid 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();

我是天王盖地虎的分割线

转载地址:http://igedo.baihongyu.com/

你可能感兴趣的文章
Effective STL 笔记
查看>>
[LeetCode] 1. Two Sum
查看>>
超时时间已到。在操作完成之前超时时间已过或服务器未响应。 (.Net SqlClient Data Provider)(转)...
查看>>
POJ2538 ZOJ1884 UVA10082 WERTYU【输入输出】
查看>>
HDU5620 KK's Steel(C++语言版)
查看>>
旋转卡壳
查看>>
2016/10/09
查看>>
自定义HorizontalScrollView的scrollBar
查看>>
c++学习笔记和思考
查看>>
27.Docker集群部署
查看>>
DNS保存
查看>>
IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop
查看>>
第一周冲刺第五天博客
查看>>
[LeetCode]Longest Increasing Path in a Matrix
查看>>
C++基础之适配器
查看>>
集合set-深入学习
查看>>
C#语言学习——面向对象的几大原则
查看>>
zk 常用资料整理(转)
查看>>
JavaScript 字符串操作
查看>>
Android中asset文件夹和raw文件夹区别
查看>>