programing

자바 이벤트 디스패치 스레드 설명

javaba 2021. 1. 15. 19:11
반응형

자바 이벤트 디스패치 스레드 설명


저는 최근 Java에서 GUI 프로그래밍의 기초를 배우고 탐구하기 시작했습니다.

한동안 프로그래밍을 해왔지만 백엔드 작업이나 작업 만 수행했으며 결과적으로 사용자 인터페이스에 가장 가까운 것은 명령 콘솔입니다 (내가 알고있는 당황 스러움).

저는 Swing을 사용하고 있으며 확장을 통해 수집 할 수있는 한 AWT도 사용하고 있습니다.

내 질문은 다음 코드를 기반으로합니다.

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );

이 이상한 코드를 완전히 이해하고 싶었고 '이벤트 디스 패칭 스레드'라는 용어를 여러 번 접했기 때문에 잠시 동안 이것을 연구했습니다. 내가 틀렸지 만 내가 이해하는대로 정정하십시오. 여러 스레드를 사용하고 Java Swing이 해당 스레드를 해석하는 방법과 관련이 있습니다. 위의 코드가 창을 만들기 전에 모든 스레드가 '안전'한지 확인하는 데 사용된다는 것도 수집합니다. 따라서 invokeLater?

나는 그것을 읽었다 :

"이벤트 전달 스레드의 프레임에서 작동하는 메서드 만 호출 할 수 있습니다."

특정 상황에서만 메인 메서드에서 프레임에서 작동하는 메서드를 호출 할 수 있습니다.

누군가 Event-Dispatching Thread가 정확히 무엇인지 설명해 주시겠습니까?

다중 실행 스레드와 어떤 관련이 있으며 해당 스레드가 주 메서드에서 호출되는 것이 안전하지 않은 방법은 무엇입니까? 또한이 invokeLater가 필요한 이유는 무엇입니까?

다른 개체처럼 창을 만들 수 없습니까?

나는 이러한 관계와 아이디어를 파악하지 못하기 때문에 연구에서 약간의 장애물을 맞았습니다.

부수적 인 점은 이것이 최고의 전반적인 결과와 결과적으로 최고의 프로그램으로 이어진다 고 믿기 때문에 심층적 인 이해를 바탕으로 저의 지식을 기반으로한다는 것입니다. 내가 무언가가 어떻게 작동하는지 심층적으로 이해한다면, 단순히 코드로 되 돌리는 것보다 팁과 조정을 효과적으로 사용할 수 있습니다. 그러니 제발 좀 더 깊이있는 설명을 제공하고 내 지식을 넓히는 것을 두려워하지 마십시오.

감사합니다.


이벤트 파견 스레드는 AWT에 의해 관리되는 특별한 스레드입니다. 기본적으로 이벤트를 처리하는 무한 루프에서 실행되는 스레드입니다.

java.awt.EventQueue.invokeLaterjavax.swing.SwingUtilities.invokeLater방법은 이벤트 큐에서 실행되는 코드를 제공하는 방법입니다. 멀티 스레딩 환경에서 안전한 UI 프레임 워크를 작성하는 것은 매우 어렵 기 때문에 AWT 작성자는 GUI 개체에 대한 작업이 단일 특수 스레드에서만 발생하도록 허용하기로 결정했습니다. 모든 이벤트 핸들러는이 스레드에서 실행되며 GUI를 수정하는 모든 코드도이 스레드에서 작동해야합니다.

이제 AWT는 일반적으로 다른 스레드에서 GUI 명령을 실행하고 있지 않은지 확인하지 않습니다 (C # 용 WPF 프레임 워크가이 작업을 수행함). 즉, 많은 코드를 작성하고 이에 대해 거의 불가지론 적이며 문제가 발생하지 않을 수 있습니다. 그러나 이것은 정의되지 않은 동작으로 이어질 수 있으므로 가장 좋은 방법은 항상 GUI 코드가 이벤트 디스패치 스레드에서 실행되도록하는 것입니다. invokeLater이를위한 메커니즘을 제공합니다.

고전적인 예는 파일 다운로드와 같은 장기 실행 작업을 실행해야한다는 것입니다. 따라서 스레드를 시작하여이 작업을 수행 한 다음 완료되면을 사용 invokeLater하여 UI를 업데이트합니다. 사용하지 않고 invokeLaterUI를 직접 업데이트 한 경우 경합 상태가되어 정의되지 않은 동작이 발생할 수 있습니다.

Wikipedia에 더 많은 정보가 있습니다.

또한 AWT 작성자가 툴킷을 멀티 스레드로 만들지 않는 이유가 궁금하다면 여기 에 좋은 기사가 있습니다.


EventDispatchThread(EDT)은 특별한 스레드가 스윙 GUI 만 예약하고 * 만드는 예를 들면 스윙의 관련 이벤트가 / 변경 / 업데이트입니다 스윙 JComponent의이 더에 대한 질문을 여기여기에

GUI로부터 모든 출력 BackGround Tasks, Runnable#Thread로 래핑한다 ) invokeLater ( 동기화 객체에서 내로invokeAndWait();

참조 URL : https://stackoverflow.com/questions/7217013/java-event-dispatching-thread-explanation

반응형