Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
线程同步Java_Java_Android - Fatal编程技术网

线程同步Java

线程同步Java,java,android,Java,Android,我正在使用Android应用程序,无法将视图与硬件同步。 让我解释一下 1) 我根据存储在数组A中的随机值(即随机休眠),从线程1的run方法中对Android麦克风进行静音和取消静音 2) 我画了蓝色的脉冲来反映麦克风的静音。这是由独立视图类完成的 3) 我在上面的视图中画了一条红线,通过在倒计时计时器的点击中调用 我一个接一个地启动两个线程,方法如下: Thread1.start counter.start() 如何同步这两个,我想一次做三件事,避免多线程。三件事是:画脉冲(这是恒定的),使

我正在使用Android应用程序,无法将视图与硬件同步。 让我解释一下

1) 我根据存储在数组A中的随机值(即随机休眠),从线程1的run方法中对Android麦克风进行静音和取消静音

2) 我画了蓝色的脉冲来反映麦克风的静音。这是由独立视图类完成的

3) 我在上面的视图中画了一条红线,通过在倒计时计时器的点击中调用

我一个接一个地启动两个线程,方法如下:

Thread1.start

counter.start()

如何同步这两个,我想一次做三件事,避免多线程。三件事是:画脉冲(这是恒定的),使红线穿过x轴移动,手机静音后立即触摸蓝色脉冲,并保持每秒移动一次,脉冲宽度反映延迟的持续时间。一旦麦克风即将解除静音,红线应离开脉冲并向前移动

目前,代码正在执行我想要的操作。但没有同步化。要么话筒先完成工作,要么图形移动速度快。它们不同步

有没有一种方法可以保持线程,强制它像coutdowntimer一样工作,或者同步这两个线程。
我无法在线程1中嵌入红线移动,因为它必须每秒跨x轴移动一次。

听起来您需要使用“”和“”

可以使用可重入锁创建的条件使一个线程“等待”另一个线程:

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.singall()”。在调用signal或wait之前,对于一个条件,您必须拥有创建该条件的锁,这就是为什么我们有“lock.lock()/lock.unlock()”调用

对wait()的调用应该放在while循环中,因为您的线程可能会被随机唤醒,即使它正在等待的条件没有被通知。在本例中,通过使用布尔标志完成循环

记住在try and finally块中锁定/解锁。如果你抛出一个异常,你会希望确保你仍然解锁你的锁,这就是为什么我们在finally块中放置unlock


您还可以使用a和“take”以一种不那么混乱的方式完成类似的任务。如果我有更多的时间,我会说得更清楚,但我希望这会有所帮助。

需要一些澄清:Thread1正在睡觉、醒来、静音、睡觉、醒来、取消静音、睡觉、醒来、静音、睡觉。。。等当蓝色脉冲出现时,红线应立即开始绘制,并以在麦克风取消静音的准确时间离开脉冲所需的速率移动?Thread1 void run(){持续(10次){audioService.setMicrophoneMute(假);thread.sleep;audioService.setMicrophoneMute(真);thread.sleep;}另一件事。我很喜欢代码的并发性方面,我最后要说的是,这里的标志不需要是易失性的,因为它被“锁”正确地保护着。我知道这是个吹毛求疵的人,但知道这一点总是好的:)在
threadTwoMethod()
中,如果我先锁定锁,然后等待。锁永远锁不开。
threadOneMethod
将如何执行其代码?@xibao您现在可能已经明白了这一点,但是调用
await()
会自动释放锁,并在
await()
完成时重新获取锁。还有,也许我误解了什么,但它不应该是
someFlag=false
after
System.out.println(“做了一些事情”)