线程同步Java
我正在使用Android应用程序,无法将视图与硬件同步。 让我解释一下 1) 我根据存储在数组A中的随机值(即随机休眠),从线程1的run方法中对Android麦克风进行静音和取消静音 2) 我画了蓝色的脉冲来反映麦克风的静音。这是由独立视图类完成的 3) 我在上面的视图中画了一条红线,通过在倒计时计时器的点击中调用 我一个接一个地启动两个线程,方法如下: Thread1.start counter.start() 如何同步这两个,我想一次做三件事,避免多线程。三件事是:画脉冲(这是恒定的),使红线穿过x轴移动,手机静音后立即触摸蓝色脉冲,并保持每秒移动一次,脉冲宽度反映延迟的持续时间。一旦麦克风即将解除静音,红线应离开脉冲并向前移动 目前,代码正在执行我想要的操作。但没有同步化。要么话筒先完成工作,要么图形移动速度快。它们不同步 有没有一种方法可以保持线程,强制它像coutdowntimer一样工作,或者同步这两个线程。线程同步Java,java,android,Java,Android,我正在使用Android应用程序,无法将视图与硬件同步。 让我解释一下 1) 我根据存储在数组A中的随机值(即随机休眠),从线程1的run方法中对Android麦克风进行静音和取消静音 2) 我画了蓝色的脉冲来反映麦克风的静音。这是由独立视图类完成的 3) 我在上面的视图中画了一条红线,通过在倒计时计时器的点击中调用 我一个接一个地启动两个线程,方法如下: Thread1.start counter.start() 如何同步这两个,我想一次做三件事,避免多线程。三件事是:画脉冲(这是恒定的),使
我无法在线程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
afterSystem.out.println(“做了一些事情”)代码>?