JavaFX SwingWorker 等效?

标签 java multithreading javafx thread-safety worker

是否有与 Java SwingWorker 类等效的 JavaFX?

我知道 JavaFX Task但是这样你只能发布字符串消息或进度。我只想在 GUI 线程中调用一个方法,就像我对 SwingWorker 所做的那样(通过发布任意类型的消息)。

这是我的意思的一个例子:

class PrimeNumbersTask extends
         SwingWorker<List<Integer>, Integer> {
     PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
         //initialize
     }

      @Override
     public List<Integer> doInBackground() {
         while (! enough && ! isCancelled()) {
                 number = nextPrimeNumber();
                 publish(number);
                 setProgress(100 * numbers.size() / numbersToFind);
             }
         }
         return numbers;
     }

      @Override
     protected void process(List<Integer> chunks) {
         for (int number : chunks) {
             textArea.append(number + "\n"); // HERE: execute in GUI thread
         }
     }
 }

解决方案

非常感谢您的回答。我正在寻找的解决方案是使用 Platform.runLater(Runnable guiUpdater) .

最佳答案

我会重写你的 SwingWorker 如下:

class PrimeNumbersTask extends Task<List<Integer>> {
    PrimeNumbersTask(TextArea textArea, int numbersToFind) {
        // initialize
    }

    @Override
    protected List<Integer> call() throws Exception {
        while (!enough && !isCancelled()) {
            number = nextPrimeNumber();
            updateMessage(Integer.toString(number));
            updateProgress(numbers.size(), numbersToFind);
        }
        return numbers;
    }
}

用法:

TextArea textArea = new TextArea();
PrimeNumbersTask task = new PrimeNumbersTask(numbersToFind);
task.messageProperty().addListener((w, o, n)->textArea.appendText(n + "\n"));
new Thread(task).start(); // which would actually start task on a new thread 

解释:

是的,我们没有像 JavaFX 中的 SwingWorker 那样的 publish() 方法,但在您的情况下使用 updateMessage() 就足够了,因为我们可以为此属性注册一个监听器,并在每次更新消息时附加一个新行。

如果这还不够,您可以随时使用 Platform.runLater()安排 GUI 更新。如果您进行了过多的 GUI 更新并且 GUI 线程变慢了,您可以使用以下习惯用法:Throttling javafx gui updates

关于JavaFX SwingWorker 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27832347/

相关文章:

c# - 使用计时器/任务/后台 worker 的数据采集循环

JavaFx Css 不适用于 Eclipse

JavaFX java.lang.IllegalArgumentException : argument type mismatch [scene builder]

Java Swing GridLayout 拉伸(stretch)了?

java - 非静态初始化器奇怪的行为

c++ - std::atomic<T> 上 volatile 操作的用例是什么?

android - JavaFXPorts(Gluon Plugin) 在安卓上保存文件

java - 仅对数组的一半实现快速排序

Java InetAddress 失败

Java processbuilder 在后台运行程序(.exe)