Tôi đang viết một ứng dụng thực hiện tác vụ menu tệp bằng cách sử dụng SwingWorker
. Mỗi phương thức được gọi trả về giá trị boolean
cho biết liệu hoạt động đã được thực thi thành công hay chưa.Làm cách nào để đọc kết quả của SwingWorker * mà không cần * chờ đợi bận?
Hiện nay tôi đang sử dụng bận rộn chờ đợi kết quả, như thế này:
public boolean executeOperation() {
final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// ..
if (aborted) {
return false;
}
// ..
return true;
}
};
worker.execute();
// busy wait
while (!worker.isDone())
;
try {
return worker.get().booleanValue();
} catch (Exception e) {
// handle exceptions ..
return false;
}
}
Có cách nào bỏ phiếu-dữ dội ít giải quyết này?
Sử dụng worker.get()
trực tiếp sẽ không hoạt động, vì nó ngăn chặn các EDT, chờ đợi cho các nhiệm vụ để hoàn thành - có nghĩa là thậm chí các hộp thoại tôi mở từ bên trong SwingWorker
sẽ không được sơn.
EDIT: Nếu có thể, tôi muốn tránh rằng phương thức (hoặc công nhân) để truyền đạt kết quả của họ một cách không đồng bộ. Tôi đang thực hiện một số phương thức ngắn (file -> mở, mới, đóng, lưu, lưu, thoát) dựa vào nhau (tức là khi cố gắng thoát, thoát các cuộc gọi gần, đóng có thể gọi là lưu, lưu có thể gọi là lưu như). Giải quyết điều này một cách không đồng bộ dường như làm cho mã phức tạp hơn nhiều.
Bạn luôn có thể đặt trong Thread.sleep (100) trong vòng lặp. –
Điều này không thay đổi thực tế là bạn đang bỏ phiếu cho một kết quả, thay vì có đối tượng thực hiện phép tính cho bạn biết khi nào nó được thực hiện. – mcfinnigan