> Java > java지도 시간 > 본문

이벤트 디스패치 스레드에서 `sleep()`을 호출하면 GUI가 정지되는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-03 13:39:03
원래의
427명이 탐색했습니다.

Why Does Calling `sleep()` on the Event Dispatch Thread Freeze the GUI?

단일 스레드에 sleep() 사용

Java에서는 wait() 및 sleep()을 사용하여 스레드 동기화를 처리합니다. 그러나 다른 스레드를 실행하면서 단일 스레드에서 sleep()을 활용하려고 하면 문제가 발생할 수 있습니다.

문제:

한 스레드에서 sleep()을 호출할 때 , 두 스레드 모두 지정된 기간 동안 실행을 일시 중지한 것으로 보입니다. 이러한 동작이 발생하는 이유는 무엇입니까?

답변:

Swing GUI로 작업할 때 기본 스레드와 다른 스레드와 구별되는 고유한 스레드가 생성을 담당합니다. 이 스레드를 EDT(이벤트 디스패치 스레드)라고 합니다. EDT에서 sleep()이 호출되면 호출이 완료될 때까지 실행이 중단됩니다.

EDT에서 GUI 이벤트 처리가 발생하므로 이 스레드의 모든 절전 작업은 이벤트 처리를 일시 중지하여 UI가 절전 모드까지 정지된 것처럼 보입니다. ()가 끝납니다.

해결책:

EDT 또는 sleep()으로 인해 의도하지 않은 실행이 차단되는 스레드에서 Thread.sleep()을 사용하지 마세요. 또는 다음 옵션을 고려하십시오.

  • 스윙 타이머: EDT에서 작업 지연을 허용합니다.
  • 스윙 작업자: 별도의 스레드에서 작업을 비동기적으로 실행하기 위한 편리한 메커니즘입니다.
  • TimerTask: 특정 간격으로 실행되도록 작업을 예약하기 위해 java.util.Timer와 함께 사용됩니다.
  • 스레드: 선택적으로 별도의 스레드를 생성하고 Thread.sleep()을 호출할 수 있지만 일반적으로 권장되지는 않습니다.

참고:

Java 1.6 이상의 경우 EDT에서 작업을 지연시키기 위해 Swing Timer 및 Swing Worker가 선호되는 옵션입니다. 이전 Java 버전의 경우 TimerTask 또는 Thread를 SwingUtilities/EventQueue#invokeXX 블록과 함께 사용하여 UI 응답성을 보장할 수 있습니다.

위 내용은 이벤트 디스패치 스레드에서 `sleep()`을 호출하면 GUI가 정지되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿