2012-03-20 4 views
2

스윙 응용 프로그램에서 교착 상태가 발생합니다. 작동하는 해결 방법이 있지만 실제로 수행하고있는 작업이 무엇인지 이해하지 못했습니다. 나중에 다시 나타날 수있는 경쟁 조건이 숨겨졌습니다.스윙 응용 프로그램에서 스레딩 및 교착 상태가 발생했습니다.

스레드 추적은 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가있는 것 같지 않다.

아무도 무슨 일이 일어나는지 설명 할 수 있습니까? 코드 줄이기 버전을 제공하려고 할 수는 있지만 관련성없는 합병증을 편집하는 데는 시간이 걸릴 수 있습니다.

+2

이 과정에서 모달 대화 상자를여시겠습니까? 또는 코드가 새 큐를 푸시합니까? – Yishai

+0

아, 그래! 나는 그것이 어떻게 작동하는지보아야 할 것이다. 기존 대기열을 대체하지 않습니까? 2 개의 AWT-EventQueue thread가되는 것은 왜입니까. – Ben

답변

1

Yishai에게 올바른 방향으로 나를 안내해 주셔서 감사합니다. 응용 프로그램은 자체 서브 클래스 java.awt.EventQueue을 인스턴스화하고 Toolkit.getDefaultToolkit().getSystemEventQueue().push(newQueue)을 사용하여 원래 큐를 대체합니다. 원래 대기열은 여전히 ​​스레드에서 작업을 처리 중이어야합니다. AWT-EventQueue-0 이벤트가 스레드 AWT-EventQueue-1의 새 대기열에 도착하기 시작하면서 동시에 교착 상태가 발생합니다.

0

어디서나 스레드를 만들고 있습니까? 그렇다면, 사용하는 것을 고려

http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html

또는 스윙으로 잘 작동하는 대신

http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html

.

+0

아니요, 명시 적으로 새 스레드를 만들지 않습니다. 일부 초기화는 메인 스레드 (일부는 invokeLater를 사용하여 EDT로 이동 함)와 EDT에서 호출되는 Swing 구성 요소의 이벤트 핸들러입니다. 그것이 어쨌든 있어야하는 방법입니다. – Ben

관련 문제