2012-09-15 1 views
0

java.util.concurrency 패키지에서 영감을 얻은 자신의 작은 동시성 프레임 워크를 학습 목적으로 만 수행했습니다. 이것은 호출 가능/미래 메커니즘에 관한 것입니다. 아래 코드는 전체 코드이며 컴파일이 가능하고 이해하기 쉽습니다.동기화 문제 : 다른 스레드가 실행되기 전에 메인 스레드가 실행되기를 원하지만 때로는 그렇지 않습니다.

제 문제는 때로는 첫 번째 스레드 (main thread)가 다른 스레드의 신호를 기다리는 교착 상태가 발생한다는 것입니다. 그러나 다른 스레드는 주 스레드가 대기 상태가되기 전에 이미 주 스레드를 알았으므로 주 스레드는 깨어날 수 없습니다.

FutureTask.get() 항상FutureTask.run() 전에 를 실행해야하지만 때로는 (new thread에 의해 호출) 실행() 메소드 (main thread에 의해 호출 됨)의 get() 메소드 전에 실행됩니다. 내가 그것을 어떻게 막을 수 있는지 모르겠다.

이것은 두 스레드가 실행되기를 원하는 의사 코드입니다.

//From main thread: 
Executor.submit().get() (in get() the main thread waits for new thread to notify) 
     ->submit() calls Executor.execute(FutureTask object) 
            -> execute() starts new thread 
               -> new thread shall notify `main thread` 

새 스레드가 실제로 새 스레드를 시작하는 주 스레드보다 빠르게 시작되고 실행되는 방식을 이해할 수 없습니다.

답변

2

전에 condition.await(); 결과가 이미 설정되어 있는지 확인하십시오.

+0

너무 쉽습니다! :-D 고마워! – Rox

관련 문제