Tôi có một vài câu hỏi liên quan đến Swing và sử dụng EDT để cập nhật GUI. Tôi mới bắt đầu đọc về nội dung này vì vậy tôi là người mới bắt đầu đầy đủ trong lĩnh vực này:Java Swing - chạy trên EDT
- Hoạt động nào bắt buộc phải chạy trên EDT? Nếu họ không, chỉ đơn giản là một ngoại lệ lớn lên?
- Có thời điểm cụ thể nào khi chúng tôi thực sự ở trên EDT tự động không?
- nếu chúng tôi lên lịch một tác vụ bằng cách sử dụng
SingUtilities.invokeLater
, chúng tôi sẽ đưa nó vào hàng đợi hiện tại của các tác vụ cập nhật GUI ngay? - Truy cập vào hàng đợi ở trên tôi đoán là đã đồng bộ hoặc một số bộ sưu tập đồng thời được sử dụng, nhưng nếu tôi lên lịch hai tác vụ cập nhật GUI, từ hai chủ đề nền, không thể nói cái nào sẽ được thêm trước? Ví dụ, nếu Thread 1 FIRST đệ trình một nhiệm vụ thiết lập văn bản của một JLable thành "yes", và sau đó, thời gian ngắn sau đó, chuỗi thứ hai xuất hiện và gửi nhiệm vụ thiết lập giá trị đó tới "no", chúng tôi có đảm bảo rằng kết quả sẽ là "có", hoặc chỉ đơn giản là vấn đề làm thế nào những điều này được lên lịch bởi hệ điều hành?
Làm thế nào chính xác SwingWorker đảm bảo rằng phương pháp
done()
được chạy trên EDT? Nó đặt đoạn mã sau:future = new FutureTask<T>(callable) { @Override protected void done() { doneEDT(); setState(StateValue.DONE); } };
vì vậy tôi đã tự hỏi liệu FutureTask bằng cách nào đó làm cho chắc chắn rằng invokeLater
được gọi là?
Cảm ơn mọi câu trả lời của bạn.
Hai câu hỏi: 4. Vì vậy, đây là luồng đầu tiên thực hiện cuộc gọi sau phải không? Vì vậy, nó có thể là trường hợp mà hệ điều hành sẽ lên lịch các chủ đề nền thứ hai invokeLater gọi FIRST và thứ tự sẽ được điều sai lầm? 5. Tôi vẫn không thấy làm thế nào mà đạt được EDT. do Submit thêm Runnable vào AccumulativeRunnable ... –
Bober02
@ Bober02 Xem javax.swing.SwingWorker.DoSubmitAccumulativeRunnable runnable, được thực thi trên EDT do sử dụng Swing 'Timer'. Đối với 4: có, bạn sẽ phải đảm bảo rằng một thread nền của bạn lên lịch chạy trước khi thread khác lên lịch runnable của nó nếu bạn muốn kiểm soát thứ tự – Robin
Tại một thời điểm, mọi thứ được gửi tới doSubmit() được chạy trong EDT. Bạn không cần phải quan tâm làm thế nào và nơi nó được thực hiện: lớp này đã được thử nghiệm, và nó hoạt động như tài liệu. –