繁体   English   中英

线程同步Java

[英]Thread synchronization 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块中锁定/解锁。 如果你抛出异常,你会想确保你仍然解锁你的锁,这就是我们将解锁放在finally块中的原因。

您还可以使用LinkedBlockQueue并“采取”以较少混淆的方式完成类似的操作。 如果我有更多的时间,我会更明确,但我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM