2010-08-02 7 views
3

Android 앱에서 작업 중이며 하드웨어와 함께보기를 동기화 할 수 없습니다. 설명해 드리겠습니다.스레드 동기화 Java

1) I 뮤트 및 스레드의 실행 방법 내에서 어레이 (A)에 저장된 임의의 잠 무작위 값()에 기초하여 안드로이드 뮤트 해제 마이크 1

2) I 블루 펄스 무승부 뮤트를 반영 마이크. 이것은 독립적 인 View 클래스에 의해 수행됩니다.

3) onTick 내에서 카운트 다운 타이머를 호출하여 위의 그림에서 그린 그래프를 가로 질러 빨간색 선을 이동합니다.

내가 두 개의 스레드를 시작 하나 다른, 이런 식 후 :

Thread1.start

counter.start();

두 가지 방법을 동기화하는 방법은 한 번에 세 가지를 수행하고 여러 스레드를 피하기를 원합니다. 세 가지 사항은 다음과 같습니다. 펄스 (일정)를 그립니다. 빨간색 선을 x 축으로 이동시키고 전화기가 음소거 되 자마자 파란색 펄스를 터치하고 1 초마다 계속 움직이면서 펄스의 폭은 지연 지속 시간을 반영합니다. 마이크가 음소거가 해제 되 자마자 빨간색 선이 맥을 떠나 앞으로 움직여야합니다.

현재 코드는 내가 원하는 것을하고 있습니다. 그러나 동기화가 없다. 마이크가 먼저 작업을 수행하거나 그래프가 빠르게 움직입니다. 그들은 동기화되어 있지 않습니다.

스레드를 보유하고 강제로 coutdowntimer로 작동 시키거나 둘 다 동기화 할 수있는 방법이 있습니까? 1 초마다 x 축을 따라 진행해야하기 때문에 스레드 1에 빨간색 선 이동을 포함시킬 수 없습니다.

+0

잠자기, 깨우기, 음소거, 잠자기, 깨우기, 음소거 해제, 잠자기, 깨우기, 음소거, 잠자기 등 ...? 파란색 선이 나타나 자마자 빨간색 선이 그려지기 시작하고 마이크가 음소거 해제 된 정확한 시간에 맥박을 떠나기 위해 필요한 속도로 이동해야합니까? –

+0

Thread1 무효 실행()에 대한 { (10 회) { audioService.setMicrophoneMute (거짓); thread.sleep; audioService.setMicrophoneMute (true); thread.sleep; } } –

답변

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()"행은 threadOneMethod가 "condition.singalAll()"을 호출 할 때까지 threadTwoMethod를 일시 중지합니다. 시그널을 호출하거나 기다리기 전에 조건에서 생성 된 잠금을 소유하고 있어야합니다.이 잠금은 "lock.lock()/lock.unlock()"호출을 사용하는 이유입니다.

await() 호출은 대기 상태가 신호되지 않은 경우에도 스레드가 임의로 깨어날 수 있기 때문에 while 루프에 있어야합니다. 루프는이 예에서 부울 플래그를 사용하여 수행됩니다.

try 및 finally 블록에서 잠금/잠금 해제해야합니다. 예외를 던지면 여전히 잠금을 해제해야하므로 잠금 해제를 finally 블록에 두는 것이 좋습니다.

덜 혼란스러운 방식으로 비슷한 것을 달성하기 위해 LinkedBlockQueue과 "take"를 사용할 수도 있습니다. 내가 더 많은 시간을 가졌다면 나는 더 명백 할 것이지만 이것이 도움이되기를 희망한다.

+0

다른 하나. 나는 코드의 동시성 측면을 좋아한다. 마지막으로 언급 할 수있는 것은 플래그가 'lock'에 의해 correclty되어지기 때문에 여기서 휘발성이 될 필요가 없다는 것이다. 니트를 여기에서 골라내는 것은 알고 있지만 언제나 그걸 알고있는 것이 좋다. –

+0

아, 네가 맞다. 생각하지 못했습니다 : –

+0

고마워요. –