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 के साथ घटना कतार को स्वाहा करने जा रहा है - वास्तव में उनमें से एक लाख। स्पष्ट रूप से, हमें पृष्ठभूमि श्रमिकों को लिखना आसान बनाने के लिए कुछ एपीआई की आवश्यकता थी जो तब 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();
यह पिछले कोड में प्रदर्शित दोषों में से किसी से ग्रस्त है
संदर्भ:
जावाएफएक्स 2.0 में वर्कर थ्रेडिंग