Android ConditionVariable
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
相关文章:
Android ConditionVariable
Android ConditionVariable 线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。 void block() //阻塞当前线程,直到条件为…...
Action Segmentation数据集介绍——Breakfast
文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast(The Breakfast Action Dataset)简介 早餐动作数据集包括与早餐准备相关的10个动作,由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…...
横道图时间标尺在P6软件中的设置
卷首语 由于其直观简洁且易于管理的特性,使其成为展示项目活动顺序及时间安排的最常用的进度管理工具。 甘特图 甘特图(Gantt Chart),又称为横道图或棒条图,是最早的项目进度管理工具之一。由于其直观简洁且易于管理…...
空间复杂度(超详解+例题)
全文目录引言空间复杂度例题test1test2(冒泡排序)test3(求阶乘)test4(斐波那契数列)总结引言 在上一篇文章中,我们提到判断一个算法的好坏的标准是时间复杂度与空间复杂度。 时间复杂度的作用…...
Document-Level event Extraction via human-like reading process 论文解读
Document-Level event Extraction via human-like reading process 论文:2202.03092v1.pdf (arxiv.org) 代码:无 期刊/会议:ICASSP 2022 摘要 文档级事件抽取(DEE)特别困难,因为它提出了两个挑战:论元分散和多事件。第一个挑战…...
H5盲盒抽奖系统源码
盲盒抽奖系统4.0,带推广二维码防洪炮灰功能和教程。 支持微信无限回调登录 标价就是源码价格,vuetp5框架编写,H5网页,前后端分离 此源码为正规开发,正版产品已申请软著。 开源无加密无授权,可以二开使用…...
低代码平台和无代码平台哪个更适合开发企业管理系统?
编者按:本文分析了开发企业管理系统所需要的平台特性,并根据这些特点和低代码无代码的优劣比较,得出低代码平台更适合开发企业管理系统。关键词:私有化部署,可视化设计,源码交付,数据集成&#…...
75岁彪马再发NFT 复活美洲狮IP
在“运动品牌Web3”的潮流里,彪马(PUMA)绝对算是发烧友级别。2月22日,这家德国服装品牌的新NFT又来了,总量10000个Super PUMA NFT中,将有4000个以0.15 ETH(约为255美元)价格正式公售…...
大学生成人插画培训机构盘点
成人插画培训机构哪个好,成人学插画如何选培训班?给大家梳理了国内较好的插画培训机构排名,各有优势和特色,供大家参考! 一:国内成人插画培训机构排名 1、轻微课(五颗星) 主打课程有…...
【算法基础】一维差分 + 二维差分
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:【C/C】算法 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…...
游戏服务器框架 技能buff篇
游戏服务器框架 技能buff篇 1.状态 state 全局API 用于定义各种状态检查 bool IsDead(){ // 死亡buff if (buff->id 10001){ return true; } return false; } bool IsInvincible(){ if (buff->id 20001 || buff->id 20002){…...
网友说socket通信讲的不彻底,原来这才是Socket
关于对 Socket 的认识,大致分为下面几个主题,Socket 是什么,Socket 是如何创建的,Socket 是如何连接并收发数据的,Socket 套接字的删除等。 Socket 是什么以及创建过程 一个数据包经由应用程序产生,进入到…...
Nginx第二讲
目录 二、Nginx02 2.1 keepalived和heartbeat介绍 2.1.1 两者的介绍 2.1.2 keepalived简介 2.1.3 VRRP协议与工作原理 2.1.4 Keepalvied的工作原理 2.2 安装环境及keepalived 2.3 启动与验证keepalived 2.4 keepalived测试 2.4.1 环境准备 2.4.2 配置keepalived 2.…...
redis(win版)
1. 前言1.1 什么是RedisRedis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务」。基于内存存储,读写性能高适合存储热点数据&am…...
【Linux】编辑器——vim(最小集+指令集+自动化配置)
目录 1.vim最小集 1.1 vim的三种模式 1.2 vim的基本操作 2.vim指令集 2.1 命令模式指令集 移动光标 删除文字 复制 替换 撤销上一次操作 更改 跳至指定的行 2.2 底行模式指令集 列出行号 跳到文件中的某一行 查找字符 保存文件 多文件操作 3.如何配置vim 配…...
Centos7+Xshell+Jenkins堆装
windows系统崩坏,重装测试类工具,心情崩了 windows硬盘损坏前,运行应用具慢。。。。。。慢着慢着就走了 从前部署在本地的jenkins,python,gitblit等相关脚本都凉透了,所以这次把服务部署到Centos7上…...
Android system实战 — Android R(11) 进程保活白名单
Android system实战 — Android R 进程保活白名单0. 前言1. 具体实现1.1 准备工作1.2 源码实现1.2.1 源码1.2.2 diff文件0. 前言 最近在Android R上实现一些需求,进行记录一下,关于进程保活的基础知识可以参考Android system — 进程生命周期与ADJ&#…...
oracle表 分组,并查每组第一条
oracle主要用到的函数:OVER(PARTITION BY) mysql主要用到的函数:LIMIT (用到3个地方:分组列、组内排序列、表名) oracle: select t.* from ( select a.*, ROW_NUMBER() OVER (PARTITION BY 分组列 ORDER BY 组内排…...
Java代码弱点与修复之——DE: Dropped or ignored exception(无视或忽略异常)
弱点描述 Dropped or ignored exception(DE)指的是在代码中抛出的异常被捕获后被无视或忽略了,而不是被适当地处理。这种情况通常发生在程序员没有处理异常或处理异常时不小心忽略了异常的情况下。 Dropped or ignored exception会导致程序无法正常工作,因为异常会阻塞程…...
JavaEE简单示例——动态SQL之更新操作<set>元素
简单介绍: 在之前我们做的学生管理系统的时候,曾经有一个环节是修改学生的数据。我们在修改的时候是必须将student对象的三个属性全部填入信息,然后全部修改才可以,这样会造成一个问题就是在我们明明只需要修改一个属性的时候却要…...
大量文件夹能一键改名吗?怎么改?4个干货技巧教你快速搞定
每次整理电脑文件时,面对成百上千个命名混乱的文件夹,手动逐个修改不仅耗时费力,还容易出现重复或格式错误。本文汇总了4种实用的批量重命名方法,从简单的系统自带功能到专业软件、插件工具,再到进阶的批处理脚本&…...
【深度解析】Claude Auto Dream:从“短期对话”到“项目级心智模型”的记忆系统升级
摘要 本文从 Anthropic 新增的 Auto Dream(/dream)功能出发,系统解析大模型“跨会话记忆一致性”这一核心难题,剖析 Auto Memory Auto Dream 组合背后的技术逻辑,并给出如何在自己项目里实现“类 Auto Dream 记忆管理…...
AutoConnect:ESP32/ESP8266 运行时 Wi-Fi 配网与 OTA 一体化方案
1. AutoConnect 库深度技术解析:面向嵌入式工程师的 ESP32/ESP8266 运行时 Wi-Fi 配置系统AutoConnect 是一个专为 ESP32 和 ESP8266 平台设计的 Arduino 库,其核心目标是在设备运行时(runtime)通过 Web 界面完成 Wi-Fi 网络的动态…...
WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用
WebGL BIM可视化:浏览器端BIM解决方案的技术实践与行业应用 【免费下载链接】xeokit-bim-viewer A browser-based BIM viewer, built on the xeokit SDK 项目地址: https://gitcode.com/gh_mirrors/xe/xeokit-bim-viewer 如何解决浏览器端BIM模型加载慢、操…...
夺回社交主动权:iBeebo如何让微博回归纯粹体验
夺回社交主动权:iBeebo如何让微博回归纯粹体验 【免费下载链接】iBeebo 第三方新浪微博客户端 项目地址: https://gitcode.com/gh_mirrors/ib/iBeebo 你是否经历过这样的时刻?通勤路上想快速刷几条微博,却被开屏广告耽误了上车时间&am…...
MySQL服务启动失败:NET HELPMSG 3534错误全面解析与实战解决方案
1. 遇到NET HELPMSG 3534错误时该怎么办 当你兴致勃勃地安装完MySQL,准备大干一场时,突然在命令行输入net start mysql后,屏幕上跳出"MySQL服务无法启动。服务没有报告任何错误。请键入NET HELPMSG 3534以获得更多的帮助"这样的提…...
Mac 版 SSH 登录脚本
Mac 版 SSH 登录脚本 整合原有编码机器人 + 新增飞书运营机器人,分区域展示、带完整名称/备注/专线IP,一键登录,Mac 专属、直接可用! 前置准备(仅执行1次) brew install sshpass完整脚本(复制保存为 robot_ssh.sh) #!/bin/bash # Mac 专用 - 编码机器人 + 飞书机器…...
ClawdBot实战教程:零基础搭建个人AI助手的完整流程
ClawdBot实战教程:零基础搭建个人AI助手的完整流程 1. ClawdBot简介:你的本地AI助手 ClawdBot是一个可以在个人设备上运行的AI助手解决方案,基于vLLM提供后端模型能力。与常见的云端AI服务不同,它完全运行在本地环境中ÿ…...
Claude浏览器扩展漏洞允许通过任意网站实现零点击XSS提示注入
网络安全研究人员披露了Anthropic公司Claude谷歌浏览器扩展中存在的一个漏洞,攻击者只需诱使用户访问特定网页即可触发恶意提示注入。漏洞原理分析Koi Security研究员Oren Yomtov在提供给The Hacker News的报告中指出:"该漏洞允许任何网站静默地向该…...
保姆级教程:在Ubuntu 20.04上搞定海思SS524/SS522 SDK编译与固件烧录
海思SS524/SS522开发实战:从零构建嵌入式Linux系统的完整指南 作为一名长期深耕嵌入式开发的工程师,我深知从零开始搭建一个完整的开发环境有多么令人头疼。特别是当你拿到一块全新的开发板,面对陌生的SDK和工具链时,那种既兴奋又…...
