[英]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.