2013-01-10 7 views
0

다른 스레드 B를 실행하는 스레드 A가 있습니다. 스레드 A는 스레드 B를 정상적으로 종료하려고 시도하는 "stopExec()"메소드를 구현하여 일부 작업을 완료하도록합니다. 그래서 내 stopExec 방법은 다음과 같이 보입니다 :기다리는 동안 CountDownLatch 예외가 발생합니다.

private CountDownLatch lock; 

public void stopExec() { 
    lock = new CountDownLatch(1); 
    threadB.finish(); 
    try { 
    lock.await(); 
    } catch(InterruptedExcetion ie) { 
    Log.d(null, "Thread A not locked."); 
    } 
    Log.d(null, "Finished."); 
} 

스레드 B가 스레드에 대한 참조를 가지고와 그것을 호출 "threadA.lock.countDown를();" 그 일이 무엇이든간에 끝났을 때.

예외가 발생하는 상황은 ... 스레드 A는 대기하지 않고 단순히 계속됩니다. 누군가가 왜/내가 뭘 잘못하고 있는지 설명 할 수 있습니까? 다른 경우에도 CountDownLatch를 비슷한 방식으로 사용했으며 예상대로 작동합니다.

감사합니다.

+0

태그 'android'을 (를) 제거했습니다.이 질문은 ** android ** – Andremoniy

+2

에 대한 스레드 코드를 표시하지 않습니다. – Blackbelt

+1

threadA 코드도 표시합니다. – Blackbelt

답변

0
lock = new CountDownLatch(1); 
threadB.finish(); 

이 코드는 깨졌습니다. lock 변수에 데이터 경쟁이 있습니다. lock 변수를 volatile으로 지정하여 문제를 해결하십시오.