2010-08-02 96 views
3

我的工作在Android应用程序,无法同步查看与硬件。 让我解释一下。线程同步的Java

1)I静音和基于存储在数组A的随机值(它们是随机的休眠),从螺纹的运行方法中的Android取消静音麦克风1.

2)I画蓝色脉冲反映静音的麦克风。这是由独立的View类完成的。

3)通过在倒数计时器的onTick中调用,我在上图中绘制的图上移动一条红线。

我开始两个线程另外一个,这样以后:

Thread1.start

counter.start();

如何这两个同步,我想在同一时间做三件事情,避免多个线程。三件事情是:绘制脉冲(其是常数),使跨x轴的红线移动,并尽快触摸蓝色脉冲作为电话处于静音状态,并且保持移动每一秒,脉冲宽度反映了延迟的持续时间。一旦麦克风即将取消静音,红线应该离开脉冲并向前移动。

目前,代码是做我想要的。但没有同步化。任何一个麦克风首先完成其工作,或者图形快速移动。他们不在同步。

有没有办法保持一个线程,迫使它表现为coutdowntimer或同步它们两个。 我无法在线程1中嵌入红线运动,因为它必须每隔x轴进行一次。

+0

需要说明一下:Thread1是睡眠,醒来,静音,睡觉,醒来,静音,睡觉,醒来,静音,睡觉等等。 红线应尽快开始绘制的蓝色脉冲出现并且旅行需要离开脉冲在该麦克风已开启的确切时间率是多少? – 2010-08-02 23:02:16

+0

线程1 无效的run() { 为(10次){ audioService.setMicrophoneMute(假); thread.sleep; audioService.setMicrophoneMute(true); thread.sleep; } } – 2010-08-03 02:52:52

回答

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(); 
    } 
} 

threadTwoMethod中的“condition.await()”行将导致threadTwoMethod暂停,直到threadOneMethod调用“condition.singalAll()”。在调用信号之前或等待,在某种情况下,您必须拥有创建条件的锁,因此我们拥有“lock.lock()/ lock.unlock()”调用。

对await()的调用应放置在while循环中,因为即使未等待它的等待条件,您的线程也可以随机唤醒。在这个例子中通过使用布尔标志完成循环。

记住锁定/中试和finally块解锁。如果你抛出一个异常,你会想要确保你仍然解锁你的锁,这就是为什么我们把解锁放在finally块中。

您也可以使用LinkedBlockQueue和“take”以较不混乱的方式完成类似的事情。如果我有更多的时间,我会更明确,但我希望这有助于。

+0

另一件事。我喜欢你的代码的并发性方面,我可以评论的最后一件事是该标志不需要在这里变化,因为它被'lock'所保护。作为一个挑剔的选手,我知道,但它总是很高兴知道:) – 2010-08-03 00:25:13

+0

啊,是的,你是对的。没想到: – 2010-08-03 02:09:13

+0

非常感谢你 – 2010-08-03 02:40:28