JavaFX SwingWorker等效吗?

Cri*_*ine 9 java multithreading javafx worker thread-safety

JavaFX是否与Java SwingWorker类等效?

我知道JavaFX 任务,但是你只能发布字符串消息或进度.我只想在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
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

eck*_*kig 7

我会改写你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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 
Run Code Online (Sandbox Code Playgroud)

说明:

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

如果这还不够,您始终可以使用它Platform.runLater()来安排GUI更新.如果你做了太多的GUI更新并且GUI线程正在变慢,你可以使用以下习语:限制javafx gui更新