2014-11-03 3 views
1

내 응용 프로그램에는 런타임 중에 독립적 인 작업을 수행하는 여러 스레드 (이 예제에서는 7 개)가 포함됩니다. 그러나 가끔씩 스레드는 데이터를 동기화해야합니다.시간, 횟수 또는 다른 여러 스레드를 기다리는 모범 사례가 있습니까?

이것은 모두 참조가있는 DataSynchronizer 개체를 호출하는 스레드에 의해 수행됩니다. 이 클래스의 흐름에 대한

내 생각은 다음과 같습니다

public class DataSynchronizer { 

    public void synchronizeData(List<Data> threadData) { 
     // Wait for all 7 threads to call this method 

     // When all 7 are here, hold them here & do work using one of the threads 
     // or a new anonymous thread 

     // Release the threads & let them continue their independent work 
    } 
} 

내 질문은, 싱크 작업을 수행하기 전에 '모든 X 스레드 대기'하는 가장 좋은 방법은 무엇입니까?

모든 스레드가 서로 최대 1 초 내에 synchronizeData 메서드를 호출한다는 것을 알고 있습니다.

그래서 내가

1) 이제 도착한 첫 번째 스레드 후 2 초 기다립니다 메서드를 호출하고 모든 스레드를 생각합니까? 또는

2) 모든 활성 스레드가 도착했는지 확인하십시오. (방금 메서드를 호출하기 전에 스레드가 충돌하는 경우 응용 프로그램이 영원을 기다립니다.)

3) Count + timeout?

4)

+1

넌 7 .. – TheLostMind

+0

중복 가능성의 값이 [CountDownLatch를 (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)를 사용할 수도 [양식의 불투명도를 설정할 때 십진수 또는 두 자리를 사용해야합니까?] (http://stackoverflow.com/questions/4/when-setting-a-forms-opacity-should-i-use-a-decimal-or) -Double) – Unihedron

답변

2

이것은 CyclicBarrier을위한 것입니다. 모든 스레드가 도착할 때까지 스레드가 대기 할 지점을 정의한 다음 동기화 또는 다른 작업을 수행하기 위해 Runnable을 선택적으로 실행합니다.

+0

'CountDownLatch'가 더 적절한 * 여기에 없을까요?. 내 말은 그가 카운트를 다시 초기화 할 필요가 없다는 뜻인가요? – TheLostMind

+0

그는 여러 번 동기화를 수행하는 것처럼 보이기 때문에 'CyclicBarrier'가 더 분명한 선택처럼 보입니다. – Kayaman

+0

오. * 여러 번 * 부분을 보지 못했습니다. :) – TheLostMind

2

필자는 java.util.concurrent.CyclicBarrier가 필요하다고 생각합니다.

1
  1. 가정 및 스레드는 매우 위험한 접근 방법입니다.
  2. 얼마나 영원 할 때까지 기다리고 있습니까? 나에게 불편한 소리.
  3. 시간 초과가되면 유용 할 수 있습니까? 프로그램을 중단하고 오류 스레드를 다시 시작한 다음 수행중인 작업에 대해 생각해보십시오. 질문

-에 따라

  • 는 스레드가 동기화에 어떻게 참여하지 않는하면 어떻게됩니까?
  • 동기화가 늦으면 어떻게됩니까?
  • 당신의 방법은 다른 스레드와 하나의 스레드를 말해야합니까? 아니면 7 명의 교환 가능 작업자입니까?
관련 문제