2011-11-13 31 views
6

Tôi muốn đợi SwingWorker của mình hoàn thành công việc, và sau đó tôi muốn thực hiện một SwingWorker khác. Trong trường hợp này Encrypteer3 là một lớp mở rộng SwingWorker.Đợi SwingWorker hoàn thành

Mã của tôi:

input = txtTekst.getText(); 
    key = txtKey.getText(); 
    System.out.println("thread1 start"); 
    Encrypteer3 a = new Encrypteer3(); 
    a.execute(); 
    while(a.isDone()==false){ 
     // do nothing 
    } 
    input = output; 
    key = txtKey1.getText(); 
    System.out.println("thread2 start"); 
    Encrypteer3 b = new Encrypteer3(); 
    b.execute(); 
    while(b.isDone()==false){ 
     // do nothing 
    } 

Điều này làm cho GUI đóng băng của tôi và sử dụng rất nhiều CPU (java sử dụng khoảng 95% CPU khi thực hiện điều này). Tôi nghĩ rằng vấn đề là nó liên tục kiểm tra nếu thread được thực hiện và đó là những gì làm cho nó để CPU chuyên sâu.

Không có phương thức join() trên lớp SwingWorker. Làm thế nào tôi có thể làm cho CPU này ít tốn kém hơn?

Trả lời

3

Tôi nghĩ rằng sử dụng vòng lặp trống là ý tưởng tồi, SwingWorker có

protected void done() 

nơi bạn có thể xác định mã thực thi khi nó đã hoàn thành, sau đó bạn có thể sử dụng listerners và hành động bắn cho rằng nếu bạn muốn thực hiện bên ngoài của SW

+2

vấn đề là tôi sử dụng SwingWorker một số lần khác nhau tùy thuộc vào tình hình. Tôi đã sử dụng PropertyChangeListener và điều đó đã làm được điều đó! cảm ơn cho câu trả lời – user1026090

+1

@ user1026090: có, PropertyChangeListener là một cách tuyệt vời để giải quyết vấn đề của bạn. 1+ cho bạn và với java, mkorbel và kowser. –

3

bạn cần ghi đè phương thức done từ SwingWorker.

Từ các tài liệu của SwingWorker#done()

thực hiện trên Chủ đề tổ chức sự kiện văn sau khi phương pháp doInBackground kết thúc. Việc thực hiện mặc định không có gì. Các lớp con có thể ghi đè phương thức này để thực hiện các hành động hoàn thành trên Thread Dispatch Thread. Lưu ý rằng bạn có thể truy vấn trạng thái bên trong việc thực hiện phương thức này để xác định kết quả của tác vụ này hoặc cho dù tác vụ này đã bị hủy hay chưa.

public class Encrypteer3 extends SwingWorker<Void, Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     // background task 
     return null; 
    } 

    @Override 
    protected void done() { 
     // will be executed when background execution is done 
    } 

} 

và của nó while(a.isDone()==false) { được dành thời gian để thực thi.

while(a.isDone()==false) { 
    // do nothing 
} 
0
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker. 

tốt hơn so với kiểm tra if(isDone) sẽ là dụng cụ Executor, nhưng trong mọi trường hợp (có nghĩa là SwingWorker), bạn phải kiểm tra thread này, làm thế nào để có được ngoại lệ (s) từ phương pháp lồng nhau (s)

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