线程操作经常用到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用。
分享到:
相关推荐
Ruby是一门非常注重面向对象编程的语言,本章将详细介绍如何定义和使用方法(函数),以及如何通过模块(Module)来实现代码复用。 **知识点概览**: - 方法定义与调用 - 参数传递机制 - 返回值与多返回值 - 私有...
` 示例中,第一个版本使用 `yield` 直接与块交互,而第二个版本通过 `&code` 参数接收一个 Proc 对象,并使用 `call` 方法执行它。`&` 符号是Ruby的语法糖,它将块转换为 Proc 对象。 总的来说,理解Ruby的线程同步...
本文将深入探讨zthread2.3.2的核心特性、主要功能以及使用方法,帮助读者理解这一高效线程库。 首先,我们要明确zthread是什么。zthread是一个轻量级、跨平台的C++线程库,它提供了高级的线程管理、同步机制和异步...
Ruby 2.7.1对语法也进行了一些改进,例如弃用了`Hash#default`方法的旧用法,鼓励使用`Hash#default_proc`,后者提供了更灵活的默认值处理方式。此外,`Array#bsearch`方法现在支持`&`运算符,使得在数组中查找指定...
Android 编程使用 Service 实现 Notification 定时发送功能示例 ...通过创建一个 Service 组件,负责发送 Notification,并使用 ConditionVariable 实现线程同步,可以实现Notification 的定时发送。
如果使用Cocos2d-x的`cc::Thread`,则需先创建一个`cc::Thread`对象,然后调用`run`方法: ```cpp cc::Thread* myThread = new cc::Thread(); myThread->run(threadFunction, nullptr); ``` 3. **启动线程**:...
它维护了一个内部计数器,线程可以通过调用`P`(也称为`Wait`或`Down`)和`V`(也称为`Signal`或`Up`)方法来获取和释放信号量。 2. **Mutex**:互斥锁用于确保在同一时刻只有一个线程能够访问特定的资源。线程在...
线程间通信用于协调不同线程的行为,如通过WaitHandle(如ManualResetEvent、AutoResetEvent)或条件变量(ConditionVariable)。这些工具可以帮助线程在特定条件满足时进行同步。 总结,"c#多线程示例"项目中的...
线程的生命周期管理是多线程编程中重要的概念,如需控制线程执行,可以使用Join、Abort、Interrupt等方法。 三、线程同步与互斥 在多线程环境中,数据安全和一致性至关重要。线程同步机制,如Mutex、Semaphore、...
2. **线程间通信**:线程间的同步和通信至关重要,可以使用事件(Event)、条件变量(ConditionVariable)等机制。 3. **资源管理**:线程可能需要访问或释放资源,如数据库连接或文件句柄,需要确保线程退出时资源...
使用扩展方法,如`Select()`、`Where()`、`OrderBy()`等,可以链式调用来构建查询。 3. **延迟执行(Deferred Execution)** LINQ查询不立即执行,而是等到需要结果时才执行,这种机制提高了效率,减少了不必要的...
互斥量的lock()方法对应于P操作,unlock()方法对应于V操作。这样,当一个线程进入临界区时,其他线程将被阻塞直到当前线程完成临界区内的操作并解锁。 此外,这个程序可能还包含了条件变量来处理更复杂的同步需求,...
使用`Task.Run()`方法可以在后台线程上执行任务。 - **async/await**:这是C# 5.0引入的关键字,可以简化异步编程,`async`定义一个异步方法,`await`用来等待异步操作完成。 4. **线程池** - .NET Framework中的...
3. **线程同步**:由于线程间的共享数据可能导致竞态条件,Ruby提供了几种同步机制,包括`Mutex`(互斥锁)、`ConditionVariable`(条件变量)和`MonitorMixin`(监视器)。这些工具用于确保在任何时候只有一个线程访问...
这些类库无需额外安装,可以直接在 Ruby 环境中使用,极大地简化了开发工作。 二、核心库与扩展库 Ruby 的标准库分为核心库和扩展库两部分。核心库是 Ruby 语言的基础,包括基本的数据类型(如字符串、数组、哈希...
3. **设计模式类**:如单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)等,是软件设计中常用的方法,帮助提高代码的可扩展性和可维护性。 4. **实用工具类**:比如字符串处理类、日期时间类、...
6. **条件变量**:`muduo`可能还提供`ConditionVariable`配合`Mutex`使用,允许线程在等待特定条件满足时释放锁并进入睡眠状态。测试将检查条件变量的`wait()`和`notify_one()`或`notify_all()`方法,确保它们能正确...
同时,使用`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 =...