前言
在开发过程中遇到在JavaFX Controller中执行FTP上传文件操作时,JavaFX线程被阻塞,对JavaFX界面的修改不执行的问题,尝试使用java.util.concurrent.FutureTask来执行上传功能,但依然失败。
调查之后,了解到原来JavaFX本身就提供javafx.concurrent包来专门处理与UI进行交互的多线程代码,保证这写交互只发生在正确的线程里面。
Java平台在java.util.concerrent包提供了一套完整的同步类库。Javafx.concerrrent包考虑了JavaFX应用程序线程和GUI开发人员面对的各种限制,在已有的API间作了平衡。
javafx.concurrent.Task
综上所述,我们可以用javafx.concurrent.Task就可以完美解决线程阻塞的问题,javafx.concurrent.Task类继承了java.utils.concurrent.FutureTask类,所以用法上与FutureTask相类似。
import javafx.concurrent.Task;
Task<Void> task = new Task<Void>() {
@Override public Void call() {
// 线程执行内容
...
Platform.runLater(() -> {
// 如果在线程执行中依然要对GUI进行修改,则调用
...
});
return null;
}
};
new Thread(task).start();