2013-10-02 4 views
0

"병렬"로 실행되는 두 개의 스레드가 내 데이터 모델 계층에 있고 둘 다 일부 값을 계산합니다. 내 데이터 모델을 두 배열, 각 내 스레드에서 생성 된 값에 대한 책임이 있으므로 mvc 패턴 설치 있어요. 메인 UI에서 배열에 새로운 데이터가 저장되지 않는다고 어떻게 알 수 있습니까?병렬 스레드 결과에서 뷰 업데이트

내 스레드는 타이머 x 초마다 실행되고 각각 하나의 정수를 생성합니다. 이들 각각을 배열에 추가해야하고 추가 할 때 뷰는 옵저버 패턴을 통해 두 배열의 업데이트 된 값에 따라 화면을 업데이트하라는 알림을 받아야합니다. 이것은 메인 ui 스레드를 차단하지 않고 발생해야합니다. 그래서 나는 실제로 스레드를 완료 할 때까지 기다릴 수 있도록 각 스레드마다 while (true) 또는 futureValue를 설정하지 않습니다. 내가 무엇을 할 수 있을지?

+1

[관찰자 패턴] (http://www.oodesign.com/observer-pattern.html) 또는 [Producer/Consumer Patterb] (http://java.dzone.com) 중 하나를 사용할 수 있습니다./articles/producer-consumer-pattern)에 따라 다릅니다. – MadProgrammer

+0

잠재적으로 배열을 업데이트하는 내 스레드에서 invokeLater를 가질 수 있습니까 (스레드로 전달할 경우)? –

+0

@JohnBaum 예, invokeLater (또는 invokeAndWait)를 사용하여 특정 구성 요소가 자체적으로 다시 칠하도록 할 수 있습니다. – Kayaman

답변

1

당신은 항상 것입니다 :

  • add 방법 마지막에 add에 동기화하려면 UI 스레드에게
  • 을 통보하는 코드를 넣어
  • 을 결과를 포함하는 배열 클래스를 확장하고 덮어 업데이 트를 사용하면 Executors.newSingleThreadExecutor()으로 얻을 수있는 하나의 스레드와 함께 ExecutorService을 사용할 수 있습니다. 그 안에서 submit() UI-Thread에 알리는 코드.
  • 귀하의 실행은 WorkerThread의 일부가되어야하고 자세한 내용은 여기에 참조

사용자 인터페이스 (done() 스윙의 이벤트 발송 쓰레드상에서 실행되는) 업데이트 done() 방법 doInBackground

  • 에서 처리 할 수 Threads and Swing

  • +0

    스윙을 사용하고 있습니다. 또한 동기화하는 이유는 무엇입니까? 스레드 내에서 업데이트 만하고 각 스레드마다 자체 배열이 있습니다. –

    +0

    아, 각 스레드마다 고유 한 배열이 있습니다. 그에 따라 내 대답을 편집합니다. – jboi

    0

    이것은 꽤 복잡한 접근 방법처럼 보입니다.

    • blocking queue
    • 배열을 제거하기를 만들고 각 스레드는 큐
    • 시작
    • 사용 SwingUtilities.invokeLater() 큐에 항목에 대한 대기 작업자 스레드에서 결과를 넣어 가지고 : 여기에 광산이 작업자 스레드에서 UI를 업데이트하십시오.