2012-01-08 43 views
8

Tôi đang sử dụng SwingWorker để thực hiện một số tác vụ tải nặng trên ứng dụng tôi đang thực hiện. Mặc dù hôm nay tôi đã vượt qua lớp Executor và ví dụ này:Sự khác biệt giữa SwingWorker và Executor

Executors.newCachedThreadPool().execute(new Runnable() { 
        public void run() { 
         someTask();  
    }); 

Ai đó có thể giải thích lý do tại sao người ta sử dụng SwingWorker thay vì ví dụ trên? Đây là cách tôi hiện đang sử dụng SwingWorker:

SwingWorker worker = new SwingWorker() {    
protected Object doInBackground() { 
    someTask(); 
return null; 
} 
}; 
worker.execute(); 
+0

Kiểm tra [API] (http://docs.oracle.com/ javase/7/docs/api/javax/swing/SwingWorker.html) và bạn sẽ thấy SwingWorker triển khai giao diện Future (và Runnable), được trả về từ phương thức 'submit (...)' của ExecutorService. Một SwingWorker đã được xây dựng để tương tác tốt với chuỗi sự kiện Swing. –

Trả lời

7

1) SwingWorker được tạo ra như betweens cầu Java Essentials Classes và Swing bằng dụng cụ Future, và khá đảm bảo rằng outoput từ phương pháp process, publishdone sẽ được EventDispatchThread

2) bạn có thể gọi SwingWorker từ Executor, đây là phương pháp an toàn nhất làm thế nào để tạo ra multithreading in Swing bằng cách thực hiện SwingWorker

3) chú ý cẩn thận với số lượng hoặc chủ đề, vì Executor không quan tâm đến someho w về SwingWorkers life_cycle

4) khác quan trọng noticehere

5) cho tiểu bang nghe từ SwingWorker bạn phải thực hiện PropertyChangeListener

5

Các SwingWorker có phương pháp bổ sung process()done() được tự động thực hiện trong event công văn. Điều này có ích nếu bạn định hiển thị tiến trình hoặc kết quả cuối cùng của mình trong giao diện người dùng.

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