2010-10-04 36 views
8

Tôi muốn có thể sử dụng lớp con SwingWorker nhiều lần là điều này có thể như tôi đã đọc trong tài liệu java "SwingWorker chỉ được thiết kế để được thực thi một lần. Thực hiện một SwingWorker nhiều lần sẽ không dẫn đến việc gọi phương thức doInBackground hai lần. "thực hiện SwingWorker nhiều lần

Bất kỳ ý tưởng nào?

Cảm ơn

+1

Bạn có nghĩa là bạn muốn tái sử dụng lớp thực hiện SwingWorker của bạn, hoặc thể hiện của lớp? – Qwerky

+0

Tôi không biết có lẽ tôi đã nhận được một cái gì đó sai, nhưng khi tôi tạo ra trường hợp công nhân và gọi execute() phương pháp không có gì được thực hiện. Tuy nhiên, khi tôi cố gắng gọi phương thức doInBackground(), các công nhân đã thực hiện –

Trả lời

8

Một thể hiện của một lớp thực hiện SwingWorker có thể thực sự chỉ chạy một lần. Không có giới hạn về instantiating như nhiều trường hợp như bạn cần và chạy chúng.

+1

Có một giới hạn, thực tế là nhiều đối tượng phải được thu gom rác làm việc này làm cho nó trở thành hạn chế. Đối với các ứng dụng nhỏ, điều này có thể không quan trọng, nhưng đối với các ứng dụng cực kỳ lớn buộc phải giảm thiểu số lượng những thứ bị thu gom rác vì lý do hiệu suất, đây là một hạn chế. Nói thẳng ra, rằng không có giới hạn nào là không chính xác ... chỉ vì nó không áp dụng cho tất cả mọi người không làm cho nó không phải là một điều. – searchengine27

+0

Bạn đã đọc bài học về lớp học chưa? Nó sẽ không hoạt động nếu một cá thể được thực hiện nhiều lần. Không có cách nào khác. Và nếu bộ nhớ là một giới hạn thì có lẽ Java không phải là giải pháp đúng. Vì vậy, nếu Java được sử dụng và có đủ bộ nhớ thì không có giới hạn. Đối với các ứng dụng lớn hơn cũng không có vấn đề gì. Chúng phải được thiết kế để thu gom rác một phần. Trường hợp cực đoan có thể cần một cái gì đó giống như một Disruptor, nhưng sau đó không có ý nghĩa có giao diện người dùng được xây dựng trong Swing –

+1

Umm ... có một thay thế. Có một cá thể của một runnable, và một 'ExecutorService'. Ngay cả trong tài liệu 'SwingWorker', nó nói rằng đó là một lớp tiện lợi. Có thể dễ dàng lựa chọn thay thế khác. 'SwingWorker' chỉ thích hợp khi bạn có thể từ bỏ những thứ nhất định cho người khác. – searchengine27

1

Bạn không thể khởi tạo bao nhiêu phiên bản bạn cần và thực thi chúng. Trong lớp SwingWorker tồn tại javax.swing.SwingWorker. MAX_WORKER_THREADS = 10. Vì vậy, bạn có thể thực hiện tối đa 10 phiên bản. Một ví dụ được giải phóng chỉ mất 10 phút trong thời gian nhàn rỗi. Không sử dụng cá thể SwingWorker như một thể hiện Thread, nó không phải là một luồng.

0

Hãy thử làm điều này:

private void startTask() {// main method that creates the background task or class that implements the SwingWorker 

    AppContext appContext = AppContext.getAppContext(); 
    if(appContext!=null){ 
     appContext.remove(SwingWorker.class); 
    } 
    MassiveMigrationTask task = new MassiveMigrationTask();// class that implements the SwingWorker 
    task.execute();// this process implicitly adds the SwingWorker.class to the appContext 
    } 

Như mô tả: "Các AppContext là một bảng tham chiếu bởi ThreadGroup mà các cửa hàng hợp dịch vụ ứng dụng" Vì vậy, vấn đề này đang xảy ra về cơ bản vì AppContext đang lưu tên của chủ đề được gọi là SwingWorker ..., vì vậy nếu bạn cố gắng tạo một thể hiện khác của chuỗi, bạn có thể sẽ không thành công, vì nó đánh giá tên chủ đề đó trước khi thực hiện một cái mới hoặc ít nhất là đặt mới trong đống đề được thực thi, cảm thấy tự do trao đổi với các mã ở đây:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/AppContext.java

PS: Chú ý: "Nếu bạn không viết một dịch vụ ứng dụng, hoặc không biết điều gì là, vui lòng không sử dụng lớp học này "

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