第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaFX中的Platform.runLater和Task

JavaFX中的Platform.runLater和Task

翻翻過去那場雪 2019-07-04 16:16:04
JavaFX中的Platform.runLater和Task我已經(jīng)做了一些研究,但我仍然非常困惑,至少可以說。有人能給我一個什么時候使用的具體例子嗎?Task以及何時使用Platform.runLater(Runnable);?到底有什么區(qū)別?在什么時候使用這些東西有金科玉律嗎?另外,如果我錯了,請糾正我,但這兩個“對象”不是在GUI中的主線程內(nèi)創(chuàng)建另一個線程的方法(用于更新GUI)嗎?
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經(jīng)驗 獲得超11個贊

使用Platform.runLater(...)用于快速和簡單的操作和Task為了復雜和大規(guī)模的行動。

為什么我們不能用Platform.runLater(...)用于長時間的計算(取自下面的參考)。

問題:后臺線程只計算在0到100萬之間,并在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();

這是一堆可怕的代碼,是對自然的一種犯罪(以及一般的編程)。首先,你會失去腦細胞,只看這雙巢的Runnable。第二,它將淹沒事件隊列中的小Runnable-實際上是其中的100萬。顯然,我們需要一些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();

它沒有出現(xiàn)在前面的代碼中的任何缺陷。

參考資料: JavaFX 2.0中的工作線程處理


查看完整回答
反對 回復 2019-07-04
?
牛魔王的故事

TA貢獻1830條經(jīng)驗 獲得超3個贊

  • Platform.runLater

    :如果您需要從非GUI線程更新GUI組件,您可以使用它將您的更新放在隊列中,并且它將由GUI線程盡快處理。
  • Task

    實現(xiàn)

    Worker

    接口,當您需要在GUI線程之外運行一個長任務時(以避免凍結您的應用程序),它仍然需要在某個階段與GUI交互。

如果您熟悉Swing,則前者相當于SwingUtilities.invokeLater和后者的概念SwingWorker.

這個任務的javadoc給出了許多例子,這些例子應該說明它們是如何使用的。您也可以參考關于并發(fā)性的教程.


查看完整回答
反對 回復 2019-07-04
?
郎朗坤

TA貢獻1921條經(jīng)驗 獲得超9個贊

現(xiàn)在可以更改為lambda版本。

@Overridepublic void actionPerformed(ActionEvent e) {
    Platform.runLater(() -> {
        try {
            //an event with a button maybe
            System.out.println("button is clicked");
        } catch (IOException | COSVisitorException ex) {
            Exceptions.printStackTrace(ex);
        }
    });}


查看完整回答
反對 回復 2019-07-04
  • 3 回答
  • 0 關注
  • 5604 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號