스윙 응용 프로그램에서 교착 상태가 발생합니다. 작동하는 해결 방법이 있지만 실제로 수행하고있는 작업이 무엇인지 이해하지 못했습니다. 나중에 다시 나타날 수있는 경쟁 조건이 숨겨졌습니다.스윙 응용 프로그램에서 스레딩 및 교착 상태가 발생했습니다.
스레드 추적은 AWT-EventQueue-0과 AWT-EventQueue-1 두 스레드간에 교착 상태가 발생하고 있음을 나타냅니다. 나의 첫 번째 질문은 이들 중 하나가 악명 높은 Event Dispatching Thread 인 경우입니다. 두 스레드가 자신의 스택 추적의 맨 아래에 다음과 같은 한 :
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
나는 문제의 뿌리는 그래픽 구성 요소를 사용하여 응용 프로그램 클래스 혼합 도메인 데이터,이 경우 두 스레드가 모두 고정하려고하는 것을 생각 a java.awt.Component$AWTTreeLock
그리고 내 자신의 물건 중 하나 (X). 내 해결 방법은 X가 잠겨있는 한 위치에서 SwingUtilities.invokeLater()
을 사용하는 것입니다. 이미 EDT에 있더라도 마찬가지입니다. Javadoc에 따르면 이것은 보류중인 모든 이벤트가 처리 될 때까지 지연되는 호출을 의미합니다. 그러나, 나는 이것이 정말로 해결책이라고 확신하지 못하며, 어쨌든 두 명의 EDT가있는 것 같지 않다.
아무도 무슨 일이 일어나는지 설명 할 수 있습니까? 코드 줄이기 버전을 제공하려고 할 수는 있지만 관련성없는 합병증을 편집하는 데는 시간이 걸릴 수 있습니다.
이 과정에서 모달 대화 상자를여시겠습니까? 또는 코드가 새 큐를 푸시합니까? – Yishai
아, 그래! 나는 그것이 어떻게 작동하는지보아야 할 것이다. 기존 대기열을 대체하지 않습니까? 2 개의 AWT-EventQueue thread가되는 것은 왜입니까. – Ben