2009-03-20 3 views
6

Opera 9.64 Build 10487의 JVM 1.6.0_12에서 실행중인 애플릿의 스레드 덤프가 있으며 3 개의 이벤트 대기열을 보여줍니다! 내가 아는 한 Java Swing 이벤트 처리는 단일 스레드입니다. 최근 업데이트에서이 변경 사항이 발생 했습니까?둘 이상의 AWT 이벤트 큐가있을 수 있습니까?

내 문제는 여러 GUI가 TreeLock보다 많은 잠금을 가지고 있기 때문에 여러 이벤트 큐가 교착 상태를 일으키는 경향이 있다는 것입니다.

답변

8

두 개 이상있을 수 있으며 브라우저에 따라 다릅니다. EventQueue documentation 메시지 :

일부 브라우저는 서로 다른 코드 기반의 애플릿을 별도의 컨텍스트로 분할하고 이러한 컨텍스트간에 벽을 설정합니다. 이러한 시나리오에서는, 문맥마다 1 개의 EventQueue가 존재합니다. 다른 브라우저에서는, 모든 애플릿을 같은 문맥에 배치합니다. 이것은, 모든 애플릿에 대해서 단일의 글로벌 EventQueue가 존재하는 것을 의미합니다. 이 동작은 구현에 따라 다릅니다.

+0

좋아, 그게 설명이 될거야. 하지만 하나의 애플릿 만 있으므로 하나의 코드베이스 일뿐입니다. 어쩌면 오페라는 프레임 당 하나의 스레드를 시작합니다 - 자바 스크립트에서와 마찬가지로 ... – tigger

4

예. 일반적으로 Toolkit.getDefaultToolkit에 대해 하나의 Toolkit이 있지만 Toolkit.getSystemEventQueue에서 여러 EventQueue (두 번째는 일반적으로 성공적으로 호출 할 수있는 권한을 갖습니다)입니다. 반환 할 EventQueue을 결정하기 위해 스택에 ThreadGroupClassLoader을 기반으로하는 마법이 있습니다.

애플릿의 출처와 구성에 따라 애플릿이 분할됩니다. 정확히 어떻게 구현되었는지는 구현에 달려 있습니다.

지금 보게 될 것은 사용자의 애플릿과 보안 컨텍스트에 대한 이벤트 대기열입니다. 보안 컨텍스트는 플러그인 자체의 대화 상자를 처리합니다. 인증서와 그런 것들을 수락하십시오. 보안 문맥은 애플릿 컨텍스트의 사용자 코드와 멀리 떨어져있게합니다.

2

또한, 모달 대화 상자를 표시 할 때 스윙은 새 EventQueue (및 스레드 IIRC)를 만듭니다.이 대화 상자는 모달 대화 상자가 닫힐 때까지 활성 상태입니다 (이전 이벤트는 "보류 중"입니다).

그러나 여러 수준의 모달 대화 상자가있을 때 (1 개의 기본 대기열 + 대화 상자 당 1 개의 대기열 또는 1 개의 기본 대기열 + 모든 대화 상자의 1 개의 대기열) 어떤 일이 발생하는지 잘 모르겠습니다.

2

"모달 대화 상자를 표시하면 스윙은 새로운 EventQueue (및 스레드 IIRC)를 만듭니다. 실제로는 잘못되었습니다. 나는 스윙 녀석과 함께 이전에 이것에 대해 논의했고 스윙은 기존의 이벤트 대기열에 새로운 필터를 추가하여 다른 소스 (창/구성 요소)에서 오는 이벤트를 필터링했다. 따라서 모달 대화 상자에는 새 스레드/EQ가 작성되지 않습니다. 이를 확인하려면 모달 대화 상자를 열고 모달 대화 상자가 열리기 전과 후에 스레드 덤프를 가져 와서 AWT 스레드 호출 스택을 비교하십시오. 적어도 그것은 표준 Java 응용 프로그램과 함께하는 방법입니다. 애플릿 사례를 아직 확인하지 않았습니다.

관련 문제