ใช้Platform.runLater(...)
สำหรับการดำเนินการที่ง่ายและรวดเร็วและสำหรับการดำเนินการTask
ที่ซับซ้อนและใหญ่
ตัวอย่าง: เหตุใดเราจึงไม่สามารถใช้Platform.runLater(...)
สำหรับการคำนวณแบบยาวได้ (นำมาจากข้อมูลอ้างอิงด้านล่าง)
ปัญหา: เธรดพื้นหลังซึ่งนับตั้งแต่ 0 ถึง 1 ล้านและอัปเดตแถบความคืบหน้าใน UI
รหัสโดยใช้Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();
new Thread(new Runnable() {
@Override public void run() {
for (int i = 1; i <= 1000000; i++) {
final int counter = i;
Platform.runLater(new Runnable() {
@Override public void run() {
bar.setProgress(counter / 1000000.0);
}
});
}
}).start();
นี่เป็นรหัสที่น่ากลัวอาชญากรรมต่อธรรมชาติ (และการเขียนโปรแกรมโดยทั่วไป) ขั้นแรกคุณจะสูญเสียเซลล์สมองเพียงแค่มองไปที่การซ้อนกันของ Runnables ประการที่สองมันจะล้นคิวงานด้วย Runnables เล็ก ๆ น้อย ๆ ซึ่งในความเป็นจริงแล้วนับล้าน เห็นได้ชัดว่าเราต้องการ API บางตัวเพื่อให้ง่ายต่อการเขียนโปรแกรมทำงานเบื้องหลังซึ่งจะสื่อสารกลับด้วย UI
รหัสโดยใช้งาน:
Task task = new Task<Void>() {
@Override public Void call() {
static final int max = 1000000;
for (int i = 1; i <= max; i++) {
updateProgress(i, max);
}
return null;
}
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();
มันได้รับความทุกข์ทรมานจากข้อบกพร่องใด ๆ ที่แสดงในรหัสก่อนหน้านี้
ข้อมูลอ้างอิง:
Worker Threading ใน JavaFX 2.0