线程同步Java

Dav*_*run 3 java android

我正在使用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"以较少混淆的方式完成类似的事情.如果我有更多的时间,我会更明确,但我希望这有帮助.