处理共享资源上的信号量冲突的最佳做法是什么?

时间:2017-06-16 05:13:01

标签: java android concurrency semaphore

我有一些代码存储发生在特定View中的MotionEvents(称之为生产者),另一个代码中的一些不同代码读取该数据用于显示目的(称之为消费者)。我本质上是重新创建一个颜色不同的颜色按钮功能,使用标准的Android按钮是不可行的。 MotionEvent存储在单个ArrayList中。对此的访问包含在单个许可信号量中,以防止提供者和使用者同时I / O到ArrayList并读取暂时数据。一切都很好。

问题是当我高速点击此视图时。在生产者方面,我向ArrayList添加了一些内容以响应MotionEvent.ACTION_DOWN,并且我将其从列表中删除以响应MotionEvent.ACTION_UP(我忽略了ACTION_MOVEs)。如果我用水龙头淹没手机,当需要添加/删除时,信号量不可用,因为我的消费者正在读取ArrayList,或者因为我没有完成处理之前的点击。

那么这个问题的最佳做法是什么?如果我错过了一个MOTION_DOWN,似乎我可以放心地忽略它,但是如果我错过了一个MOTION_UP,我的消费者是不会卡住显示按钮,就像手指仍被按下一样?我看到一个偶然的显示错误(与快速点击无关)可能是由错过的MOTION_UP引起的。

1 个答案:

答案 0 :(得分:0)

现在很难说出你的方案究竟有什么问题,但你可能会遇到一些同步问题。

对于生产者 - 消费者模式,BlockingQueue是您最好的选择。在您的情况下,只需使用简单的无界实现。

执行mBlockingQueue.add(MotionEvent)以响应按钮单击,并在后台线程上以无限循环消耗事件:

while(true) {
    processEvent(mBlockingQueue.take());
}

作为旁注:我不认为您真的需要后台线程才能在点击时更改按钮的颜色。有other simpler ways