簡體   English   中英

線程同步Java

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM