当前位置: 首页 > news >正文

杭州便宜的手机网站建设企业网络营销顾问

杭州便宜的手机网站建设,企业网络营销顾问,app 设计网站建设,四川省人民政府最新任免Android ConditionVariable 线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。 void block() //阻塞当前线程,直到条件为…

Android ConditionVariable

线程操作经常用到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;}
}

实例

简单的延时:

public class MainActivity extends Activity implements OnClickListener {private Button btn_output;private TextView textView;private MyHandler mHandler;private boolean isStart;private String str = "";private ConditionVariable mConditionVariable;private final int REFRESHTEXT = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取按钮btn_output = (Button) findViewById(R.id.btn);btn_output.setOnClickListener(this);textView = (TextView) findViewById(R.id.txt);mHandler = new MyHandler();mConditionVariable = new ConditionVariable();isStart = true;new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile(isStart) {//延时等待3秒mConditionVariable.block(3000);//如果是点击了按钮,则先将条件重置,否则block会失效mConditionVariable.close();//线程唤醒后通知主线程更新TextView的文本mHandler.sendEmptyMessage(REFRESHTEXT);}}}).start();}private class MyHandler extends Handler {public void handleMessage(Message msg) {switch(msg.what) {case REFRESHTEXT:textView.setText(str += 's');break;}}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubmConditionVariable.open();}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();isStart = false;}
}

实例2

尽管现在诞生的高级语言里边有了什么STM,协程,绿程的概念,但写代码总会遇到现实(商业级平台都不会用很新的东西)的多线程的问题。

比如有时候你需要同步的获取在另一个线程执行的代码的结果,在android里这种场景下ConditionVariable就非常好用了。

if (Looper.myLooper() != Looper.getMainLooper()) {final ConditionVariable completed = new ConditionVariable(); // 构造一个条件变量view.runOnUiThread(new Runnable() {@Overridepublic void run() {try {doSomeThingInUiThread(); // 将期望在另外线程做的事post出去} finally { // finally很重要,防止运行时异常远跳转将ConditionVariable忘了opencompleted.open(); // 事情办完了,notify到另外线程}}
});completed.block(TIMEOUT_WAIT_UI); // 等着另外线程做的事完成,同时支持设置超时
} else {doSomeThingInUiThread();
}

当然了以上是很简单的一个场景,使用ConditionVariable非常方便且够用。对于复杂的多线程之间的协同还是使用标准的条件变量结合lock + while 循环检查。

在一些新语言中有非常丰富的并发编程原语(future, delay, promise),特别是协程让我们用代码自主的确定代码流之间的协作关系而不是被动的作为OS调度器的奴隶,来支撑一些并行需求。

参考链接:https://www.jianshu.com/p/c03aa7bf3ebf
https://www.cnblogs.com/yydcdut/p/4273526.html
https://developer.aliyun.com/article/24161

http://www.zhongyajixie.com/news/31914.html

相关文章:

  • 计算机应用网站建设与维护是做什么最新app推广
  • 安阳网站建设商祺怎么打广告吸引客户
  • 河北建设网网站百度推广
  • 贸易公司网站制作常州网络推广哪家好
  • 南通网站关键词推广网站新站整站排名
  • 注册网站域名有什么用百度竞价app
  • 做网站设计用到的软件太原seo自媒体
  • 如何做网站直播入口广州seo网站开发
  • 宝安做网站电脑培训零基础培训班
  • 怎样做网站pptseo排名软件免费
  • 查看网页源代码无锡seo关键词排名
  • 18款禁用软件app破解版合肥百度关键词优化
  • 烟台做网站百度seo培训要多少钱
  • 找网站建设企业网络seo外包
  • 绩溪住房建设网站360推广助手
  • 目前流行的网站开发设计网站模板搭建
  • 厦门网站设计一般要多久网站seo快速排名
  • 网站注册qq线上推广渠道主要有哪些
  • 北京做网站的好公司有哪些北京seo招聘网
  • 2017年网站推广怎么做站长之家素材
  • 中国旅游网站的建设哪家网络营销好
  • 网站构建计划seo优化排名经验
  • seo的网站上海宝山网站制作
  • 网站最合适的字体大小微商引流的最快方法是什么
  • 优秀网站例子app拉新推广平台有哪些
  • 周口网站关键词优化东莞seo代理
  • 滨州做企业网站软文广告的案例
  • 做详情页生成代码的网站全网营销整合营销
  • wordpress-5.0.3seo快排
  • 做百度推广网站找谁好泉州关键词搜索排名