2009-03-20 38 views
6

Tôi đã có một kết xuất chuỗi của một applet chạy trên JVM 1.6.0_12 trong Opera 9.64 Build 10487 - và nó hiển thị ba hàng đợi sự kiện! Theo như tôi biết việc xử lý sự kiện Swing Java là đơn luồng - đã làm thay đổi này trong bất kỳ cập nhật gần đây?Có thể có nhiều hàng đợi sự kiện AWT không?

Vấn đề của tôi là, nhiều hàng đợi sự kiện sẽ có xu hướng gây ra các bế tắc vì tôi đã có thêm một số khóa hơn chỉ là GUI TreeLock.

Trả lời

8

Có thể có nhiều hơn một và tùy thuộc vào trình duyệt. EventQueue documentation nói:

Một số trình duyệt phân vùng ứng dụng trong các cơ sở mã khác nhau thành các ngữ cảnh riêng biệt và thiết lập các bức tường giữa các ngữ cảnh này. Trong trường hợp như vậy, sẽ có một EventQueue cho mỗi ngữ cảnh. Các trình duyệt khác đặt tất cả các applet vào cùng một bối cảnh, ngụ ý rằng sẽ chỉ có một EventQueue toàn cầu duy nhất cho tất cả các applet. Hành vi này phụ thuộc vào việc triển khai thực hiện.

+0

Ok, đó sẽ là giải thích. Nhưng tôi chỉ có một applet nên nó chỉ là một codebase. Có thể opera bắt đầu một chuỗi cho mỗi khung hình - vì nó làm cho tập lệnh java ... – tigger

4

Có. Thông thường sẽ chỉ có một Toolkit cho Toolkit.getDefaultToolkit, nhưng nhiều EventQueue s từ Toolkit.getSystemEventQueue (trong đó từ 1.2.2 bạn thường nhận được quyền để gọi thành công). Có phép thuật dựa trên ThreadGroupClassLoader s trên ngăn xếp để xác định xem EventQueue nào cần trả lại.

Applet được phân đoạn phụ thuộc vào nguồn gốc và cấu hình của chúng. Chính xác cách thức này được thực hiện là phụ thuộc thực hiện.

Bây giờ, những gì bạn có thể thấy là hàng đợi sự kiện cho applet của bạn và ngữ cảnh bảo mật. Ngữ cảnh an toàn xử lý các hộp thoại từ chính plugin đó. Chấp nhận chứng chỉ và những thứ tương tự. Bối cảnh an toàn giữ cho chúng tránh xa mã người dùng trong ngữ cảnh applet của bạn.

2

Ngoài ra, Swing tạo một EventQueue mới (và chuỗi IIRC) khi bạn hiển thị hộp thoại phương thức, hàng đợi sự kiện này đang hoạt động (trường hợp trước bị "giữ") cho đến khi hộp thoại phương thức bị đóng. Tuy nhiên, tôi không chắc chắn điều gì xảy ra khi có nhiều cấp độ của các hộp thoại phương thức (1 hàng đợi chính + 1 hàng đợi cho mỗi hộp thoại, hoặc 1 hàng đợi chính + 1 hàng đợi cho tất cả các hộp thoại).

2

"Swing tạo EventQueue mới (và chuỗi IIRC) khi bạn hiển thị hộp thoại phương thức" Thực ra nó sai. Tôi đã thảo luận điều này một thời gian trước đây với Swing guy và Swing chỉ thêm bộ lọc mới vào hàng đợi sự kiện hiện có để lọc ra các sự kiện bắt nguồn từ nguồn khác nhau (cửa sổ/thành phần). Vì vậy, không có chủ đề/EQ mới được tạo cho hộp thoại phương thức. Bạn có thể xác minh điều này bằng cách mở hộp thoại phương thức và nhận kết xuất chuỗi trước và sau khi hộp thoại phương thức được mở và so sánh ngăn xếp chuỗi cuộc gọi AWT. Ít nhất nó là như thế nào với ứng dụng Java tiêu chuẩn. Tôi chưa kiểm tra trường hợp applet.

Các vấn đề liên quan