线程androidAndroid ConditionVariable的用法
查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!
在Android开辟中,如果需要线程同步,可以使用Java系统库的wait()和notify()...但是这些代码的编写比拟麻烦。Android提供了一个ConditionVariable类便利线程同步操作。
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.
自己简单写了一个Demo,效果有点牵强...Demo的效果是,TextView每过3秒,就会输出一个字符s。如果点击按钮可以马上输出。
人生是洁白的画纸,我们每个人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们每个人则是人生道路的远足者;人生还像是一块神奇的土地,我们每个人则是手握农具的耕耘者;但人生更像一本难懂的书,我们每个人则是孜孜不倦的读书郎。
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;
@Override
protected 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() {
@Override
public void run() {
// TODO Auto-generated method stub
while(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;
}
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mConditionVariable.open();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
isStart = false;
}
}
文章结束给大家分享下程序员的一些笑话语录:
人工智能今天的发展水平:8乘8的国际象棋盘其实是一个体现思维与创意的强大媒介。象棋里蕴含了天文数字般的变化。卡斯帕罗夫指出,国际象棋的合法棋步共有1040。在棋局里每算度八步棋,里面蕴含的变化就已经超过银河系里的繁星总数。而地球上很少有任何数量达到这个级别。在金融危机之前,全世界的财富总和大约是1014人民币,而地球人口只有1010。棋盘上,所有可能的棋局总数达到10120,这超过了宇宙里所有原子的总数!经典语录网
---------------------------------
原创文章 By
线程和android
---------------------------------
线程androidAndroid ConditionVariable的用法的更多相关文章
- 线程框架Executor的用法举例
java5线程框架Executor的用法举例 Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务.这个框架主要由三个接口和 ...
- Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist
Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...
- 线程安全,syncronized 用法
1,为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. public class Tra ...
- python线程池 ThreadPoolExecutor 的用法及实战
写在前面的话 (https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 文章来源于互联网从Python3.2开始,标准库为我们提供了 concurrent.future ...
- 动力节点Java培训告诉你Java线程的多功能用法
现在的java开发可谓是八仙过海各显神通啊!遥想当下各种编程语言萎靡不振,而我Java开发异军突起,以狂风扫落叶之态,作为Java培训行业的黄埔军校,为了守护Java之未来,特意总结了一些不被人所熟知 ...
- java中线程队列BlockingQueue的用法
在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.本文 ...
- Java线程中yield()的用法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程.(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会.因此, ...
- java中的线程问题(二)——线程的创建和用法。
在java中一个类要当作线程来使用有两种方法. 1.继承Thread类,并重写run函数 2.实现Runnable接口,并重写run函数 因为java是单继承的,在某些情况下一个类可能已经继承了某个父 ...
- 线程中join()的用法
Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public static void main(String[] args) throws Interrupted ...
随机推荐
- Java项目生成静态页面
第一次做项目需要生成静态页面,网上很多大牛对将网页生成静态页面有很多异议.说一下我的看法. 不外乎有以下因素: 1.从页面加载时间来看:静态页面不需要与数据库建立连接,尤其是访问数据量较大的页面,这种 ...
- Android学习小Demo(21)ListView的联动选择
在日常的App开发中,尤其是在开发生活服务的应用上,非常多时候,我们会须要联动地展现省市区的数据等,需求大概例如以下: 1)展现全部省份 2)当点击某省份的时候,在二级菜单上展现此省份以下所属的城市列 ...
- php调用webservice报错Class 'SoapClient' not found
原文:php调用webservice报错Class 'SoapClient' not found php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Clas ...
- Ubuntu加上一个命令搜索路径/etc/ environment
编辑~/.bashrc文件,然后在最后加上你想设置的目录就可以了. 这样做之后就可以在终端中执行你想要的程序了,不过如果你使用其它程序在后台调用的话可能还是会调用不到,因为这个设置是针对bash有效的 ...
- Linux内核头文件与内核与库的关系
看上一篇文章中对buildroot的介绍,里面的文档第 3.1.1.1 Internal toolchain backend 节内容 C库会去访问Linux kernel headers(*.h)文件 ...
- js面向对象学习总结
1.函数作为参数进行传递 function a(str,fun){ console.log(fun(str)) }; function up(str){ return str.toUpperCase( ...
- Web学习-apache视图log刊物
视图apache刊物 apache日志位置 不同的系统位置不同. widnows 假如是windows的话,xampp下应该是都存在的,直接去找apache的folder/log/access.log ...
- Newtonsoft.Json 将C#对象转化为json格式
object To json public static string ObjectToJson(object obj) { JsonSerializerSettings jss = new Json ...
- 在MVC中使用SignalR
在MVC中使用SignalR 接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET Si ...
- ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能
本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...