线程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
---------------------------------