Sau khi giới thiệu Mô hình bộ nhớ Java, các nguyên tắc Swing đã được thay đổi để cho biết rằng bất kỳ thành phần Swing nào cần được khởi tạo trên EDT để tránh trạng thái cá thể không được xuất bản.Có được phép tải các lớp Swing trong chuỗi không phải là EDT không?
Điều tôi không thể tìm thấy ở bất cứ nơi nào liệu việc tải lớp cũng được bắt buộc phải có trên EDT hay chúng tôi có thể tải trước các khóa Swing chính trong chuỗi nền? Có bất kỳ tuyên bố chính thức nào từ Sun/Oracle về vấn đề này không? Có bất kỳ lớp nào được biết là giữ trạng thái tĩnh không an toàn, do đó cần được tải trên EDT không?
Làm rõ để giải quyết câu hỏi của Nemi: đây là vấn đề thực tế. Một phần đáng kể thời gian khởi động ứng dụng của chúng tôi, được dành cho việc nạp lớp và tải phông chữ/hình ảnh trên EDT. Hầu hết điều này có thể được quy cho Swing và các thư viện liên quan.
Dưới đây là nền nền: Như nhiều ứng dụng Swing khác, khi khởi động, chúng tôi đang xây dựng sẵn nhiều biểu mẫu để làm cho giao diện người dùng phản hồi nhanh hơn. Sau khi profiling, chúng tôi thấy rằng thời gian thực tế để xây dựng biểu mẫu tương đối nhanh - tải chậm của tất cả các lớp và phông chữ (đọc đĩa là chậm trong thiết lập của công ty bằng máy quét vi-rút, trình theo dõi giám sát, trình theo dõi kiểm tra và thiên thần biết những gì khác tacked trên trình điều khiển HDD).
Chúng tôi đã cố gắng tạo các biểu mẫu giống nhau trong một chuỗi nền (vi phạm các quy tắc của Swing) và sau đó vứt chúng đi. Khi chúng ta hoàn thành, chúng ta xây dựng các biểu mẫu giống nhau trên EDT, nhanh hơn nhiều khi tất cả các lớp được nạp và bất kỳ tệp nào khác nằm trong bộ đệm đĩa. Nó làm việc cho chúng tôi, và chúng tôi có thể sẽ tiếp tục làm điều đó trừ khi một cái gì đó thực sự xấu xảy ra.
Điều tôi đang hỏi liệu đây có phải là thực hành an toàn, thực hành tốt hay hack?
Đặc biệt, hai lớp singleton tôi có thể nghĩ đến là UIManager và AppContext. Cả hai javadocs không cho biết liệu chúng được coi là threadsafe. Giao diện của AppContext được đồng bộ hóa đúng cách, ngoại trừ phương thức isDisposed() không đọc trạng thái đúng (cần đồng bộ hóa). UIManager là miễn phí cho tất cả, mặc dù một khi EDT bắt đầu, tôi không nghĩ rằng bất kỳ chủ đề nào khác sẽ làm thay đổi nó. – ddimitrov
Đây là một câu hỏi thú vị. Nó hoàn toàn là học vấn, hay là có một vấn đề thực sự mà bạn đang cố giải quyết? Tôi không thể nghĩ ra một lý do chính đáng nào bạn muốn làm điều này. – Nemi
@Nemi, bổ sung thêm ngữ cảnh cho câu hỏi – ddimitrov