我正在使用Android App,无法将View与硬件同步.让我解释.
1)我根据线程1的run方法中存储在数组A中的随机值(随机休眠)静音和取消静音Android的麦克风.
2)我画出反映麦克风静音的蓝色脉冲.这是由独立的View类完成的.
3)我在上面视图中绘制的图形上移动一条红线,通过在倒数计时器的onTick内调用.
我一个接一个地启动两个线程,这样:
Thread1.start
counter.start();
如何同步这两个,我想一次做三件事,避免多个线程.有三个方面:绘制脉冲(恒定),使红线在x轴上移动,一旦手机静音就触摸蓝色脉冲,并且每秒保持移动,脉冲宽度反映延迟的持续时间.一旦麦克风即将取消静音,红线应该离开脉冲并向前移动.
目前,代码正在做我想要的.但没有同步.麦克风要先完成它的工作,要么图表快速移动.他们没有同步.
有没有办法保持一个线程,强制它表现为coutdowntimer或同步他们两个.我不能在线程1中嵌入红线运动,因为它必须每秒在x轴上进行.
Mat*_*ogt 13
听起来你需要使用" ReentrantLock "和" Condition "
您可以使用从可重入锁创建的条件使一个线程"等待"另一个线程:
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean someFlag = false;
public void threadOneMethod() {
lock.lock();
try {
someFlag = true;
condition.signalAll();
} finally {
lock.unlock();
}
}
public void threadTwoMethod() {
lock.lock();
try {
while (someFlag == false) {
condition.await();
}
System.out.println("Did some stuff");
someFlag = false;
} finally {
lock.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
threadTwoMethod中的"condition.await()"行将导致threadTwoMethod暂停,直到threadOneMethod调用"condition.singalAll()".在调用signal或await之前,你必须拥有创建条件的锁,这就是为什么我们有"lock.lock()/ lock.unlock()"调用.
对await()的调用应放在while循环中,因为你的线程可以被随机唤醒,即使它没有发出等待的条件.在这个例子中,通过使用布尔标志完成循环.
记得在try和finally块中锁定/解锁.如果你抛出异常,你会想确保你仍然解锁你的锁,这就是我们将解锁放在finally块中的原因.
你也可以使用LinkedBlockQueue和"take"以较少混淆的方式完成类似的事情.如果我有更多的时间,我会更明确,但我希望这有帮助.
| 归档时间: |
|
| 查看次数: |
13985 次 |
| 最近记录: |