`
chroya
  • 浏览: 661488 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ConditionVariable的用法

阅读更多

      线程操作经常用到wait和notify,用起来稍显繁琐,而Android给我们封装好了一个ConditionVariable类,用于线程同步。提供了三个方法block()、open()、close()。


void block()
阻塞当前线程,直到条件为open
void block(long timeout)
阻塞当前线程,直到条件为open或超时
void open()
释放所有阻塞的线程
void close()
将条件重置为close


      下面讲一个实际的例子。用ConditionVariable实现自定义长按事件。前面讲过自定义长按事件的两种方式(传送门 ),此处算是第三种方式吧,虽然挺牵强的,但是这只是展示运用ConditionVariable的小例子。

package chroya.fun;

import android.content.Context;
import android.os.ConditionVariable;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;

public class LongPressView3 extends View{
	private ConditionVariable cv = new ConditionVariable();
	private Thread longPressThread;
	private Runnable longPressRunnable;
	//是否释放
	private boolean isReleased;

	public LongPressView3(Context context) {
		super(context);
		longPressRunnable = new Runnable() {
			public void run() {
				//阻塞指定的时间
				cv.block(ViewConfiguration.getLongPressTimeout());
				if(!isReleased) {
					//还没up,则触发长按
					performLongClick();
				}
			}
		};
		createThread();
		post(null);		
	}
	
	private void createThread() {		
		longPressThread = new Thread(longPressRunnable);
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent event) {
		int action = event.getAction();
		switch(action) {
		case MotionEvent.ACTION_DOWN:
			isReleased = false;
			//重置为close状态
			cv.close();	
			createThread();
			longPressThread.start();
			break;
		case MotionEvent.ACTION_MOVE:
			break;			
		case MotionEvent.ACTION_UP:
			//up掉
			isReleased = true;
			//打开阻塞的线程
			cv.open();
			break;			
		}
		return true;
	}	
}

     原理是这样的:down的时候,重置ConditionVariable的状态,开启一个线程,线程里面将阻塞指定的时间。如果阻塞时间已到,线程醒了,还未up,则形成长按。如果在线程醒来之前就释放了,则当到线程醒来的时候,执行判断,得知已经up,则未形成长按。
    每次down都创建一个线程,很浪费资源,所以这不是自定义长按事件的好方法,好方法在上一篇博文中,这仅为讲解ConditionVariable用。

5
0
分享到:
评论
1 楼 敲敲大葱头 2011-06-29  
好文章,学习了

相关推荐

    Making Use of Ruby

    Ruby是一门非常注重面向对象编程的语言,本章将详细介绍如何定义和使用方法(函数),以及如何通过模块(Module)来实现代码复用。 **知识点概览**: - 方法定义与调用 - 参数传递机制 - 返回值与多返回值 - 私有...

    ruby 知识总结

    ` 示例中,第一个版本使用 `yield` 直接与块交互,而第二个版本通过 `&code` 参数接收一个 Proc 对象,并使用 `call` 方法执行它。`&` 符号是Ruby的语法糖,它将块转换为 Proc 对象。 总的来说,理解Ruby的线程同步...

    zthread2.3.2 代码和lib

    本文将深入探讨zthread2.3.2的核心特性、主要功能以及使用方法,帮助读者理解这一高效线程库。 首先,我们要明确zthread是什么。zthread是一个轻量级、跨平台的C++线程库,它提供了高级的线程管理、同步机制和异步...

    ruby-2.7.1.zip

    Ruby 2.7.1对语法也进行了一些改进,例如弃用了`Hash#default`方法的旧用法,鼓励使用`Hash#default_proc`,后者提供了更灵活的默认值处理方式。此外,`Array#bsearch`方法现在支持`&`运算符,使得在数组中查找指定...

    Android编程使用Service实现Notification定时发送功能示例

    Android 编程使用 Service 实现 Notification 定时发送功能示例 ...通过创建一个 Service 组件,负责发送 Notification,并使用 ConditionVariable 实现线程同步,可以实现Notification 的定时发送。

    Cocos2d-x 中使用多线程

    如果使用Cocos2d-x的`cc::Thread`,则需先创建一个`cc::Thread`对象,然后调用`run`方法: ```cpp cc::Thread* myThread = new cc::Thread(); myThread->run(threadFunction, nullptr); ``` 3. **启动线程**:...

    nachos Lab3实习报告

    它维护了一个内部计数器,线程可以通过调用`P`(也称为`Wait`或`Down`)和`V`(也称为`Signal`或`Up`)方法来获取和释放信号量。 2. **Mutex**:互斥锁用于确保在同一时刻只有一个线程能够访问特定的资源。线程在...

    c#多线程示例

    线程间通信用于协调不同线程的行为,如通过WaitHandle(如ManualResetEvent、AutoResetEvent)或条件变量(ConditionVariable)。这些工具可以帮助线程在特定条件满足时进行同步。 总结,"c#多线程示例"项目中的...

    C#多线程编程实战Code源代码

    线程的生命周期管理是多线程编程中重要的概念,如需控制线程执行,可以使用Join、Abort、Interrupt等方法。 三、线程同步与互斥 在多线程环境中,数据安全和一致性至关重要。线程同步机制,如Mutex、Semaphore、...

    PB多线程实现

    2. **线程间通信**:线程间的同步和通信至关重要,可以使用事件(Event)、条件变量(ConditionVariable)等机制。 3. **资源管理**:线程可能需要访问或释放资源,如数据库连接或文件句柄,需要确保线程退出时资源...

    LING,多线程

    使用扩展方法,如`Select()`、`Where()`、`OrderBy()`等,可以链式调用来构建查询。 3. **延迟执行(Deferred Execution)** LINQ查询不立即执行,而是等到需要结果时才执行,这种机制提高了效率,减少了不必要的...

    PV操作程序

    互斥量的lock()方法对应于P操作,unlock()方法对应于V操作。这样,当一个线程进入临界区时,其他线程将被阻塞直到当前线程完成临界区内的操作并解锁。 此外,这个程序可能还包含了条件变量来处理更复杂的同步需求,...

    C#多线程代码下载

    使用`Task.Run()`方法可以在后台线程上执行任务。 - **async/await**:这是C# 5.0引入的关键字,可以简化异步编程,`async`定义一个异步方法,`await`用来等待异步操作完成。 4. **线程池** - .NET Framework中的...

    Working with Ruby Threads(完整版)

    3. **线程同步**:由于线程间的共享数据可能导致竞态条件,Ruby提供了几种同步机制,包括`Mutex`(互斥锁)、`ConditionVariable`(条件变量)和`MonitorMixin`(监视器)。这些工具用于确保在任何时候只有一个线程访问...

    ruby_1_9_3_stdlib_rdocs.gz

    这些类库无需额外安装,可以直接在 Ruby 环境中使用,极大地简化了开发工作。 二、核心库与扩展库 Ruby 的标准库分为核心库和扩展库两部分。核心库是 Ruby 语言的基础,包括基本的数据类型(如字符串、数组、哈希...

    cpp-common-class-源码.rar

    3. **设计模式类**:如单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)等,是软件设计中常用的方法,帮助提高代码的可扩展性和可维护性。 4. **实用工具类**:比如字符串处理类、日期时间类、...

    muduo的Mutex-thread测试

    6. **条件变量**:`muduo`可能还提供`ConditionVariable`配合`Mutex`使用,允许线程在等待特定条件满足时释放锁并进入睡眠状态。测试将检查条件变量的`wait()`和`notify_one()`或`notify_all()`方法,确保它们能正确...

    chromium base thread

    同时,使用`base::BindOnce`或`base::RepeatingCallback`创建任务,并通过`Thread`的`task_runner()`方法获取Task Runner,然后将任务提交到Task Runner进行异步执行。 ```cpp #include "base/threading/thread.h" ...

    闭锁

    `Mutex`提供了`lock()`和`unlock()`方法,分别用于获取和释放闭锁。以下是一个简单的示例: ```php class ThreadedExample extends Thread { private $mutex; public function __construct() { $this->mutex =...

Global site tag (gtag.js) - Google Analytics