线程同步Java
我正在使用Android App,无法将View与硬件同步。 让我解释。
1)我根据线程1的run方法中存储在数组A中的随机值(随机睡眠),对Android的麦克风进行静音和取消静音。
2)我画出反映麦克风静音的蓝色脉冲。 这是由独立的View类完成的。
3)我在上面视图中绘制的图形上移动一条红线,通过在倒数计时器的onTick内调用。
我一个接一个地启动两个线程,这样:
Thread1.start
counter.start();
如何同步这两个,我想一次做三件事,避免多个线程。 有三个方面是:绘制脉冲(恒定),使红线在x轴上移动并在手机静音时触摸蓝色脉冲,并且每秒保持移动,脉冲宽度反映延迟的持续时间。 一旦麦克风即将取消静音,红线应该离开脉冲并向前移动。
目前,代码正在做我想要的。 但没有同步。 麦克风要先完成它的工作,要么图表快速移动。 他们没有同步。
有没有办法保持一个线程,强迫它表现为coutdowntimer或同步他们两个。 我无法在线程1中嵌入红线运动,因为它必须每秒在x轴上进行。
听起来你需要使用“ 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(); } }
threadTwoMethod中的“condition.await()”行将导致threadTwoMethod暂停,直到threadOneMethod调用“condition.singalAll()”。 在调用signal或await之前,你必须拥有创建条件的锁,这就是为什么我们有“lock.lock()/ lock.unlock()”调用。
对await()的调用应该放在while循环中,因为你的线程可以被随机唤醒,即使它没有发出等待的条件。 在这个例子中,通过使用布尔标志完成循环。
记得在try和finally块中锁定/解锁。 如果你抛出一个exception,你会想确保你仍然解锁你的锁,这就是我们将解锁放在finally块中的原因。
您还可以使用LinkedBlockQueue并“采取”以较少混淆的方式完成类似的事情。 如果我有更多的时间,我会更明确,但我希望这有帮助。