2010-08-02 95 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