2008-11-15 3 views
5

J2ME 응용 프로그램을 작성하고 있습니다. 조각 중 하나는 디렉토리의 내용을 주기적으로 폴링하는 것이고, 새로운 것이 있으면 화면에 그 내용을 그립니다. 나는 UI 폼이 자체적으로 포인터를 가진 폴링 쓰레드를 시작하게하고 폴링 쓰레드가 뭔가를 찾으면 다시 폼을 호출하고 syncrhonized 메소드를 호출하여 디스플레이를 업데이트한다. 이것은 잘 작동하는 것 같습니다.Java/J2ME의 UI 스레드와 상호 작용

내가 가진 질문은 이것입니다. C#/.NET에서는 비 UI 스레드가 UI를 업데이트하는 것이 좋지 않다는 것을 알고 있으며이를 처리하는 올바른 방법은 UI 스레드까지 위임하는 것입니다.

예. 다음 :

public void DoSomeUIThing() 
{ 
    if (this.uiComponent.InvokeRequired) 
    { 
     this.uiComponent.Invoke(someDelegateThatCallsBackToThis); 
    } 
    else 
    { 
     this.uiComponent.Text = "This is the update I want to happen"; 
    } 
} 

이 프로세스를 관리하는 방법에 해당하는 J2ME가 있습니까? Java는 어떻습니까? 또는 Java/J2ME가 이와 관련하여 더 좋은 점이 있습니까? 그렇지 않다면 어떻게됩니까?

[편집] Swing은 SwingUtilities.invokeLater() 및 invokeAndWait() 메소드를 통해 내가 묻는 것을 지원하는 것으로 보입니다. J2ME에 해당하는 프레임 워크가 있습니까?

+0

방금 ​​J2ME 특정 정보로 내 대답을 완료했습니다 – VonC

+0

고마워요! 내 응용 프로그램은 LCDUI이기 때문에 걱정하지 않아도됩니다. 적어도 David Pierce는 그렇게 생각합니다. – Cory

답변

5

Java와 관련하여 설명하는 내용은 SwingWorker (worker thread)입니다.

스윙 프로그램이 장기 실행 작업을 실행해야하는 경우 대개 백그라운드 스레드라고도하는 작업자 스레드 중 하나를 사용합니다.

  • 초기 스레드, 초기 응용 프로그램 코드를 실행 스레드 :

    스윙 프로그램 스레드의 다음과 같은 종류가 포함되어 있습니다.

  • 모든 이벤트 처리 코드가 실행되는 이벤트 발송 스레드입니다. Swing 프레임 워크와 상호 작용하는 대부분의 코드는이 스레드에서 실행되어야합니다.
  • 시간이 많이 걸리는 백그라운드 작업이 실행되는 백그라운드 스레드라고도하는 작업자 스레드.

Single-thread rule :
스윙 구성 요소가 실현되면, 영향을 미치거나 해당 구성 요소의 상태에 따라 수있는 모든 코드는 이벤트 파견 스레드에서 실행해야합니다.

J2EE 컨텍스트에서 사용하는 경우 referencing a SwingWorker from an EJB 일 때주의해야합니다. 당신이 RIMlet, 블랙 베리 특정 사용하는 CLDC 기반 응용 프로그램과 같은 표준 어떤 MIDP 지원 장치에서 실행되는 미들 릿, 또는 인스턴스에 대한 와 같은 응용 프로그램을 개발하는 경우 J2ME에 대해서는

, 그것은 의존한다 따라서 API는 BlackBerry 단말기에서만 실행됩니다.

MIDP의 UI 클래스와 달리 RIM은 UI 작업이 이벤트 스레드에서 발생한다는 점에서 Swing과 유사하므로 MIDP와 마찬가지로 스레드로부터 안전하지 않습니다. 이벤트 스레드에서 코드를 실행하려면 응용 프로그램에서 이벤트 객체에 대한 잠금을 가져 오거나 invokeLater() 또는 invokeAndWait()를 사용하여 개발자에게 추가 작업을해야하지만 정교함에는 가격 태그가 있어야합니다.

LCDUI의 경우 access a form from multiple threads 수 있습니다.

+0

편집 참조 - "단일 스레드 규칙"링크는 스윙에 대해이를 수행하는 방법을 설명합니다. J2ME에서 비슷한 것을 아십니까? – Cory

1

j2me 앱의 경우 간단하게 유지하고 싶을 것입니다. 중요한 것은 이벤트 스레드에서만 UI 구성 요소를 만지는 것입니다. 이를 수행하는 직접적인 방법은 invokeLater or invokeAndWait을 사용하는 것입니다. 라이브러리에 따라 그 이상은 액세스 할 수 없습니다. 일반적으로 이들이 플랫폼에 제공되지 않으면 아마 스레드 지원이없고 문제가되지 않을 것입니다. 예 : the blackberry does support it.

1

SWT에서 개발할 경우이 작업은 Display 개체의 asyncExec() 메서드를 사용하여 수행 할 수 있습니다. UI 스레드가 다른 스레드에서 수행 된 변경 사항을 실행하도록 Runnable을 구현하는 객체를 전달합니다.

자바 ME의 여러 프로필이 있습니다 here

public void itemRemoved(final ModelEvent me) 
{ 
    final TableViewer tableViewer = this.viewer; 

    if (tableViewer != null) 
    { 
     display.asyncExec(new Runnable() 
     { 
     public void run() 
     { 
      tableViewer.remove(me.getItem()); 
     } 
     } 
    } 
} 
4

에서 차용 한 예이다. MIDP를 의미하는 경우 Display.runSerially이 원하는 것입니다.

AWT (스윙)의 경우는 EventQueue.invokeLater (자바 1.1에 EventQueue 방법을 가지고 있지 인해 SwingUtilities.invokeLater 만 필요 - 1.2 10 번째 생일을 축하하는 것입니다) 사용합니다. 공용 DOM API의 경우 DOMService.invokeLater을 사용하십시오.

GUI API가 스레드 안전성에 대해 어떤 주장을 하든지 관계없이 잘못된 것일 수 있습니다 (구현할 수 없기 때문에 일부 JDK7에서 Swing 주장이 삭제됨). 어쨌든 응용 프로그램 코드는 스레드로부터 안전하지 않을 수 있습니다.

1

나는 복잡한 GUI는 거의 모든 제조업체가 만든 휴대폰의 수백만에서 실행중인 대형 미들 렛이 같은 MIDP UI 툴킷은, 실제로 스레드 안전하다는 것을 입증 할 수 있고, 나는 그런 측면에서 문제를 본 적이 없다.