zoukankan      html  css  js  c++  java
  • 线程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
    ---------------------------------

  • 相关阅读:
    java类型转换
    JVM内存各个区域分工简单介绍
    用数组实现栈
    一些关于Spring的随笔
    设计模式学习笔记(三)之静(动)态代理模式、适配器模式
    浅谈经典排序算法
    PetStore项目总结
    设计模式学习笔记(二)之观察者模式、装饰者模式
    Spring的校验(Validator)
    设计模式学习笔记(一)之工厂模式、单例模式
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3153498.html
Copyright © 2011-2022 走看看