JavaFX中javafx.concurrent.Task类的使用

本文介绍了JavaFX中Task类的使用方法,包括如何利用Task类处理耗时任务而不阻塞UI线程,以及如何通过Task类的不同回调方法来更新UI和处理任务执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaFX中处理比较耗时的任务或操作,在不阻塞UI线程的情况下需要用到javafx.concurrent.Task类;Task 实现了WorkerEventTarget接口,并且继承了java.util.concurrent.FutureTask 类,可视为Java线程与JavaFX事件机制之间的桥梁。Task可作为普通Runnable直接供Thread使用,也可作为Callable传递给ExecutorService。无论是哪种情况,均可先用业务委托封装无法异步执行的同步。Task由 Runnable和 Future组成,因此可由Thread直接执行,以下是调用示例:
        Task<Integer> task = new Task<Integer>() {
            @Override
            protected Integer call() throws Exception {
                int iterations;
                for (iterations = 0; iterations < 100000; iterations++) {
                    if (isCancelled()) {
                        break;
                    }
                }
                return iterations;
            }

            @Override
            protected void running() {
                updateMessage("running...");
            }
            @Override
            protected void succeeded() {
                updateMessage("Done!");
                int value = getValue();
                System.out.println(value);
            }
            @Override
            protected void cancelled() {
                updateMessage("Cancelled!");
            }
            @Override
            protected void failed() {
                updateMessage("Failed!");
            }
        };
        new Thread(task).start();
        //根据实际需要处理消息值
        task.messageProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                System.out.println(newValue);
            }
        });
 
 
经测试我们知道call()方法是在新开启的线程中运行,我们可以在此方法中执行自己的任务,例如从网络获取数据或上传数据到服务器上;该方法可根据实际情况返回自己需要的数值,有点类似于Android中的AsyncTask类的doBackgroud(...)方法,在些方法中不可以直接处理应用中UI控件,不在同一线程中访问JavaFX Application线程中的成员是不安全的,我们可以在successeded()这个方法中处理任务运行后的结果,successeded()方法运行在JavaFx Application线程中,我们可以查看原码验证。 
 
    public final void setOnSucceeded(EventHandler<WorkerStateEvent> value) {
        checkThread();
        getEventHelper().setOnSucceeded(value);
    }
    private void checkThread() {
        if (started && !isFxApplicationThread()) {
            throw new IllegalStateException("Task must only be used from the FX Application Thread");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值