线程同步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并“采取”以较少混淆的方式完成类似的事情。 如果我有更多的时间,我会更明确,但我希望这有帮助。