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

原文地址:https://www.cnblogs.com/jiangu66/p/3153498.html