2、Platform、Task

javafx.application.Platform

作为JavaFx的工具类

//内部线程也是UI线程,作用是,线程空闲时候,更新UI,但是仍不可做频繁大量的UI更新
Platform.runLater(new Runnable() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
});
//即使关闭最后一个窗口,程序也会保持运行
Platform.setImplicitExit(false);
//退出程序
Platform.exit();
//检测电脑是否支持一些特性
Platform.isSupported(ConditionalFeature.MEDIA);

javafx.concurrent.Task

使用Platform.runLater()方法,虽然可以实现更新UI,但是也仅限于简单的更新,如果出现大量频繁的更新,会造成UI卡死

Task类可以实现对复杂任务进度的监听,并且配合监听器可以实现实时更新UI

public class MyTask extends Task<Integer> {
    // 通知更新进度
    @Override
    protected void updateProgress(long workDone, long max) {
        super.updateProgress(workDone, max);
    }
    // 通知更新进度
    @Override
    protected void updateProgress(double workDone, double max) {
        super.updateProgress(workDone, max);
    }
    // 通知更新消息
    @Override
    protected void updateMessage(String message) {
        super.updateMessage(message);
    }
    // 通知更新标题
    @Override
    protected void updateTitle(String title) {
        super.updateTitle(title);
    }
    // 参数value即为call方法的返回值,当call方法执行完成后调用
    @Override
    protected void updateValue(Integer value) {
        super.updateValue(value);
    }
    // 以上方法在call方法中需要主动调用(updateValue除外)
    // 调用后,即可配合Task实现类实例的相关监听器进行监听
    @Override
    protected Integer call() throws Exception {
        for (int i = 0; i < 10; i++) {
            Thread.sleep(1000);
            updateTitle("第" + i + "次更新");
            updateMessage("第" + i + "次更新");
            updateProgress(i,9);
        }
        return 1;
    }
}

使用监听器

MyTask myTask = new MyTask();
// 绑定Title监听
myTask.titleProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        // 对UI的修改操作
    }
});
// 绑定Message监听
myTask.messageProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        // 对UI的修改操作
    }
});
// 绑定Value(即call方法返回值)监听
myTask.valueProperty().addListener(new ChangeListener<Integer>() {
    @Override
    public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) {
        // 对UI的修改操作
    }
});
// 对Progress(进度)的监听
myTask.progressProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        // 对UI的修改操作
    }
});
// 启动任务
new Thread(myTask).start();