2012-04-19 4 views
1

나는 할 수있는 몇 가지 개발이있어, 나는 사용할 패턴이 있는지 알아 내려고 노력하고있다. 문제는 간단합니다 :자바 스레드 : 생산자 - 소비자

나는 많은 밟기를 시작하는 메인 스레드를 가지고 있습니다. 주 스레드는 각 스레드가 완료 될 때까지 기다린 다음 다른 작업을 수행해야합니다. 기존 코드가 약간 엉망입니다. 당신이 보는대로

//launch threads 
..... 
//wait for threads to finish 
while (ThreadRepository.getInstance().isActiveThreadGroup(myGroupId)) { 
    Thread.sleep(5000); 
} 

//doing something else 

그래서, while 루프는 어떤 쓰레드가 실행하지 않을 때까지 계속 실행 : 나는 뭔가 실행되고 있는지 확인하기 위해 스레드 그룹을 확인 while 루프가 있습니다. 거기에 뭔가를

예를 들어 일부 BlockingQueue를 사용하고, 각 스레드 넣어 (또는 소요) : 나는 패턴 생산자 - 소비자에 생각 나는 그런 일을하고 싶은

. 대신에 잠을자는 대신에 myQueue.take()과 같은 것이 있지만 대기열이 비어있을 때까지 기다리는 것이 좋습니다. 비어있는 경우 실행중인 스레드가 없음을 의미합니다.

인터넷에서 검색하려고하지만 내 문제와 일치하는 것을 찾지 못했습니다.

누구든지 내 문제를 해결하는 데 가장 효율적인 방법을 알고 있습니까?

+0

thead의 개수가 미리 결정된 경우 'CountDownLatch'를 사용할 수 있습니다. –

+0

Marko, "기여자들의 호의를 돌려주지 않고"당신은 무엇을 의미합니까? –

답변

2

N 스레드가 끝날 때까지 하나 개의 스레드 대기를 가지고있는 두 가지 쉬운 방법이 있습니다

  1. 는 메인 스레드 호출이 가입 확인() 다른 모든 스레드가. 스레드가 완료되거나 이미 완료되면 join()이 반환됩니다.
  2. N으로 초기화 된 CountDownLatch를 생성하고이 래치를 모든 스레드에 전달하고 각 스레드가 완료되면 래치에 countDown()을 호출하고 기본 스레드 호출 래치에 await(). 이 두 번째 기법은 첫 번째 기법보다 약간 더 어렵지만 더 유연하고 재사용 가능하며 N 개의 스레드가 아직 완료되지 않은 경우에도 약간의 지연 후에 다시 깨우는 것이 가능합니다.
+0

감사합니다. 나는이 수업을 몰랐다. 그것은 내가 필요한 것입니다. 나는 시험 했어. 그것은 매력처럼 작동한다. –

0

다음과 같이 BlockingQueue를 사용할 수 있습니다 :

  • 메인 쓰레드는 큐에서 메시지를 받아이를 계산이 완료되면

    • 각 자식 스레드는 큐에 메시지를 넣습니다. 메시지 수가 스레드 수와 같으면 모든 스레드가 완료됩니다.

  • +0

    예, 나쁘지 않은 생각입니다. –