2015-01-07 16 views
5

Java có thể tạo nhiều hơn một EDT cùng một lúc không?Có cách nào để thiết lập hai hoặc nhiều chuỗi gửi sự kiện (EDT) không?

Tôi đang thử nghiệm thiết lập EDT và cách hoạt động trong việc cập nhật nội dung của bảng điều khiển "nặng" với hàng tá bảng được nhúng bên trong và hàng trăm thành phần hoàn toàn. Hiện nay tôi có

 public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 

Tôi đã nhìn vào bài viết sau đây:

Measuring "busyness" of the event dispatching thread

How does the event dispatch thread work?

Java Event-Dispatching Thread explanation

http://en.wiki2.org/wiki/Event_dispatching_thread

và vân vân .

Tôi hiểu rằng nếu có, nói một tá sự kiện, mà một EDT duy nhất phải xử lý, Java đã có một cơ chế lập kế hoạch nội bộ để nhóm/ưu tiên các sự kiện này.

Theo http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

"This is necessary because most Swing object methods are not "thread safe": invoking them from multiple threads risks thread interference or memory consistency errors." 

Vì vậy, những gì nếu tôi tạo ra một EDT thứ 2 với chủ đề mới (new Runnable() {...} .start() dưới đây?

Will java tự động hợp nhất hai EDTs trở lại một vì sợ an toàn thread?

 new Thread(new Runnable() { 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 
    }).start(); 
+3

Chuỗi thứ hai của bạn không phải là EDT, chỉ T.;) –

+2

Tôi không nghĩ bạn có thể tạo EDT. Swing tạo ra EDT riêng của mình. Bạn có thể tạo bao nhiêu chủ đề tùy thích (lên đến một số giới hạn lớn), nhưng chúng sẽ không phải là của EDT. Mã ví dụ của bạn tạo ra một đối tượng 'Runnable', nhưng nó sẽ không chạy' panel.update' trong chuỗi của bạn. Thay vào đó, đối tượng này được trao cho Swing, nó tiết kiệm nó ở đâu đó, và sau đó cuối cùng EDT tìm thấy nó và chạy nó. – ajb

+0

có thể trùng lặp của [Nhiều chủ đề công văn sự kiện] (http: // stackoverflow.com/questions/7323306/multiple-event-dispatch-threads) – Jayan

Trả lời

2

chỉ có thể có một sự kiện văn đề!

Nhưng tại sao bạn thậm chí muốn có nhiều hơn một chủ đề cho điều này? Ngay cả đối với các bảng "nhiệm vụ nặng nề" với nhiều thành phần (trong ứng dụng tôi hiện đang làm việc trên đó phải có 1000 thành phần) một EDT là đủ. Hãy nhớ rằng bạn không nên thực hiện bất kỳ nhiệm vụ nào trên EDT sử dụng nhiều thời gian CPU. Nếu không, bạn sẽ chặn EDT cho các sự kiện cập nhật và GUI của bạn sẽ trở nên "chậm chạp" khi trả lời cho người dùng nhập vào.

Cũng nên nhớ rằng tất cả các thành phần GUI nên được tạo và thao tác chỉ từ bên trong EDT vì nhiều thành phần không phải là chuỗi lưu. Bỏ qua hướng dẫn này có thể làm việc cho các công việc cụ thể nhưng sớm hay muộn bạn sẽ nhận được hành vi lạ và/hoặc treo máy!

+1

Có các tính toán mà tôi đã thực hiện trong một lớp học cũng chịu trách nhiệm tạo bảng và thành phần. vì vậy tôi cho rằng đó là một thực hành tốt cho tôi để tách logic lõi từ GUI vào lớp khác nhau – mk7

+0

Đúng! Nói chung, bạn muốn xem mô hình [Model-View-Controller] (http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). Ngoài ra, hãy nhớ luôn luôn đảm bảo rằng việc tạo và thao tác các thành phần GUI được thực thi trên EDT. Hầu hết các trường hợp này tự động xảy ra khi bạn gọi mã từ bên trong ví dụ: một ActionListener (được chạy trên EDT) nhưng đôi khi bạn muốn truy cập các phần tử GUI tạo thành một luồng khác nhau thì bạn sẽ phải sử dụng SwingUtilities.invokeLater hoặc SwingUtilities.invokeAndWait. –

1

Giao diện Swing đơn luồng. Đó là chủ đề duy nhất là EDT. Nếu bạn muốn giới thiệu một EDT thứ hai (và vẫn còn có GUI làm việc), bạn sẽ phải viết lại rất nhiều mã Swing bên trong để giải thích sự phức tạp của độ an toàn của luồng.

Thêm một EDT khác sẽ giới thiệu độ phức tạp hơn cho một số lượng tăng không rõ (hoặc giảm) về hiệu suất.

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