2010-02-24 5 views
1

편집와 GUI 응용 프로그램 : 나는 원격 서버에 연결하고 GUI를 업데이트하는 응용 프로그램이자바 : 백그라운드 스레드

일이 clearer- 확인하십시오. 응용 프로그램은 MVC 패턴을 사용합니다.

1) 원격 서버가 내 응용 프로그램의 데이터 모델을 업데이트하는 메시지를 보낼 수 있습니다.

2) GUI 컨트롤러 클래스는의 PropertyChangeListener 인터페이스를 구현하고 모델에 대한 업데이트를 수신하고, 응용 프로그램은 사용자가 다음 원격 서버로 다시 메시지를 보낼 수

3) GUI보기 클래스를 업데이트 GUI에서 동작. 원격 서버의 데이터를받는 동일한 개체를 사용합니다.

저는 현재 '원격 서버 통신'개체와 GUI 클래스를 기본 메서드로 초기화합니다. 통신 객체는 모델을 독립적으로 업데이트 할 수 있으므로 SwingUtilities.invokeLater()를 사용하여이 객체를 초기화해야합니까?

답변

2

은 내가 당신을 얻을 완전히 모르겠지만, 난 그냥 당신이 GUI를 만지지 언제든지, 그것은 AWT 스레드에서의 있는지 확인 어쨌든에

에 던져 한 가지가 있습니다. 이론적으로 이것은 GUI를 만드는 것을 의미합니다 (실제로는 메인 또는 다른 스레드에 주어진 스레드에서 GUI를 만드는 데 문제가 거의 없지만 한 지점에서 문제를 발견하고 이에 대해 제안 함)

어쨌든, 이것은 다른 스레드에서 GUI를 업데이트 할 때마다 invokeLater를 사용한다는 것을 의미합니다. 기간.

(참고 GUI를 당신이 콜백 내에서 GUI와 원하는 무엇이든 할 수 있도록 항상 AWT 스레드를 것 콜백 (의 ActionListener 등)을 통해 호출 할 때마다. 수정 된 메시지와 함께

, I 당신이 스레드 경합의 기회를 가지고 어쨌든 GUI I/O를 수행한다면, 그것을 처리하는 한 가지 방법은 invokeLater에서 모든 "논쟁적인"모든 것을 수행하는 것입니다.

주 스레드 (이론적으로 setVisible (true)까지의 모든 것)에서 GUI를 인스턴스화하는 것은 대부분 합법적이지만 다른 스레드와 충돌 할 가능성이있는 경우 invokeLater가 모든 것을 처리합니다 매우 결정론적인 방식으로

+0

청구서 - 감사합니다. 나는 원래의 질문을 다소 단순화하여 명확하게했다. – Luhar

1

내 질문은 이것이다 : 자신의 접속 나사 공급 업체 코드를 초기화한다 주어진, 난 여전히 명시 적으로 (원격 응용 프로그램을 다시 메시지를 보내는 이벤트를 구문 분석 모델을 업데이트) 내 모든 원격 통신 코드를 삽입한다 , 별도의 스레드 GUI를 초기화 코드로?

나는 제대로 이런 것을 이해합니다.

공급 업체 라이브러리는 자체 스레드를 시작하고 결국 코드에서 특정 메서드를 콜백합니다.

그러면 앱이 업데이트됩니다. 쓰레드는 제 3 자 라이브러리에서 이미 사용되고 있으며 충분합니다.

앱이 공급 업체 원격 서버와 통신해야하는 경우에는 자체 스레드를 사용해야합니다. 그러면 대답은 '예'입니다.

공급 업체 라이브러리에서 보내는 내용에 "반응"하면 별도의 스레드가 필요하지 않습니다.

+0

오스카, 답장을 보내 주셔서 감사합니다. 예, 앱은 원격 서버와도 통신합니다. 나는 재 설계를 생각해야 할 것이다. – Luhar

1

SwingUtilities.invokeLater()는 Runnable을 GUI의 Event Dispatch 스레드에서 직접 실행합니다.

다시 말해서 결코은 GUI가 응답하지 않게하기 위해 백그라운드 작업을 실행하는 데 사용하지 않습니다. Sun tutorial 또는 기타 배경 Thread에 표시된대로 서브 클래스 SwingWorker.