programing tip

대부분의 UI 프레임 워크가 단일 스레드 인 이유는 무엇입니까?

itbloger 2020. 12. 26. 09:36
반응형

대부분의 UI 프레임 워크가 단일 스레드 인 이유는 무엇입니까?


예를 들어 Java Swing과 Android UI는 모두 단일 UI 스레드가 모든 UI 업데이트를 담당하는 단일 스레드 모델을 사용합니다. 프레임 워크 디자이너가 다른 스레드 모델보다 한 스레드 모델을 선택한 이유는 무엇입니까?

다중 스레드 UI 모델이 더 복잡한 비용에도 불구하고 잠재적으로 더 많은 성능을 제공하지 않습니까? 스레드 관련 버그가 심하기 때문에 후자가 큰 문제라는 것을 알고 있지만 단순성 이외의 단일 스레드 모델에 다른 이점이 있는지 궁금합니다.


프레임 워크 디자이너가 다른 스레드 모델보다 한 스레드 모델을 선택한 이유는 무엇입니까?

에서 말의 입 :

AWT는 처음에 일반 다중 스레드 Java 라이브러리로 노출되었습니다. 그러나 Java 팀이 AWT와 사람들이 만난 교착 상태 및 인종에 대한 경험을 살펴보면서 우리는 우리가 지킬 수없는 약속을하고 있다는 것을 깨닫기 시작했습니다.

이 분석은 AWT의 플레이 상태와 전반적인 업계 경험을 검토 한 1997 년 Swing의 디자인 리뷰 중 하나에서 절정에 이르렀으며 Swing 팀의 권장 사항 인 Swing은 매우 제한된 멀티 스레딩 만 지원해야한다는 것을 받아 들였습니다.

(전체 기사를 읽고 결정에 대해 자세히 설명하고 똑같은 문제와 단일 스레드 모델로의 궁극적 인 이동이 Xerox PARC에서 더 일찍 발생했다고 설명합니다. 30 년 전에 발명 됨)

다중 스레드 UI 모델이 더 복잡한 비용에도 불구하고 잠재적으로 더 많은 성능을 제공하지 않습니까?

GUI를 그리고 사용자 작업을 처리 (UI 스레드가 수행해야하는 모든 것)는 정상적인 2D 응용 프로그램에서 병목 현상이 발생하지 않기 때문에 절대 아닙니다.


다중 스레드 UI 모델이 더 복잡한 비용에도 불구하고 잠재적으로 더 많은 성능을 제공하지 않습니까?

대부분의 경우에는 그렇지 않으며 추가 된 복잡성은 대부분의 경우 이익보다 더 많은 해를 끼칠 것입니다. 또한 UI 프레임 워크는 기본 OS 모델도 처리해야합니다. 물론, 프로그래머와는 거리가 먼 모델과 추상화를 중심으로 작동 할 수 있지만이 경우에는 그럴 가치가 없습니다.

UI 임시를 업데이트하는 여러 스레드로 인해 발생하는 버그의 양은 대부분 의미없는 성능 향상을위한 것보다 훨씬 클 것입니다 (만약 이득이있는 경우 스레딩에는 잠금 및 동기화로 인해 자체 오버 헤드가 발생할 수 있습니다. 실제로 성능을 저하시키는 경우가 많습니다.)

이 경우에는 필요할 때만 명시 적으로 다중 스레드를 사용하는 것이 좋습니다. 대부분의 경우 UI에서 모든 것을 하나의 스레드에서 원하고 여러 스레드를 사용하여 많은 것을 얻지 못합니다. UI 상호 작용은 거의 병목 현상이 아닙니다.


아니, 아마 아닐 것이다. 적어도 CPU에서 스레드를 실행하려고 할 때는 아닙니다. GPU에는 이미 다양한 형태의 병렬 처리가 많이 있습니다. 단순한 GUI 작업이 아니라 멋진 3D (음영, 반사 등)


교착 상태 예방이 전부라고 생각합니다.

Swing의 구성 요소는 스레드로부터 안전한 것으로 간주되지 않으며이 이벤트 디스패처 스레드 때문일 필요도 없습니다. UI가 다중 스레드 인 경우 전체 앱은 스레드로부터 안전한 방식으로 동작하는 모든 구성 요소에 의존해야하며 그렇지 않은 경우 모호한 상황에서 교착 상태가 발생할 수 있습니다.

그래서 더 안전합니다.

뿐만 아니라 Windows Forms (& .Net), GTK, Motif 및 기타 여러 업체에서 동일한 디자인을 선택했습니다. Java가 상호 작용하는 기본 OS API에 의해이 결정을 내리게되었는지 궁금합니다. 확실히 SWT는 Windows Forms에 의해 이러한 상황에 처하게됩니다.

자세한 내용은 "EDT"를 시작하는 것이 좋습니다. http://en.wikipedia.org/wiki/Event_dispatching_thread

.NET의 경우 SwingWorker에 해당하는 것을 BackgroundWorker라고합니다.


이는 UI 애플리케이션의 특성 때문입니다.

입력 (마우스 또는 키보드)을 읽고 이벤트를 전달하고 처리하고 화면을 다시 그리도록해야합니다.

다중 스레드 프로세스에서 시도하십시오.

참조 URL : https://stackoverflow.com/questions/5544447/why-are-most-ui-frameworks-single-threaded

반응형