Java doInBackground()和process()之间的关系是什么?

Java doInBackground()和process()之间的关系是什么?,java,swingworker,Java,Swingworker,你好。你能解释一下这两者之间的关系吗?我正在尝试做一个使用SwingWorker的程序。我认为publishvalue只是将值传递给process 编辑: 从中看到此代码 我想知道,chunks是一个列表,对吗?那么,SwingWorker是如何为其增加价值的呢 嗯。但是什么时候?因为我不能预测块的大小,你不能。由SwingWorker决定何时实际通知GUI更改。javadoc对此进行了解释。读它:例如,我做了这样一件事:publishAbc;出版定义;publishGhi;chunk.size

你好。你能解释一下这两者之间的关系吗?我正在尝试做一个使用SwingWorker的程序。我认为publishvalue只是将值传递给process

编辑:

从中看到此代码


我想知道,chunks是一个列表,对吗?那么,SwingWorker是如何为其增加价值的呢

嗯。但是什么时候?因为我不能预测块的大小,你不能。由SwingWorker决定何时实际通知GUI更改。javadoc对此进行了解释。读它:例如,我做了这样一件事:publishAbc;出版定义;publishGhi;chunk.size会有所不同吗?是的,可能会。链接中有一个例子是JB Nizet发布的。你读了吗?doInBackground是在后台线程中运行的,不是EDT。在EDT的上下文中调用Process,以允许您处理传递给publish方法的信息。无法保证在调用publish后何时调用进程。SwingWork对通过publish方法传递的项进行排队,以便在将来某个时候,可以将它们传递给进程,从队列中基本上删除并提供给您,这就是为什么publish不需要传递单个值,而是需要一个列表
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");
         }
     }
 }

 JTextArea textArea = new JTextArea();
 final JProgressBar progressBar = new JProgressBar(0, 100);
 PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
 task.addPropertyChangeListener(
     new PropertyChangeListener() {
         public  void propertyChange(PropertyChangeEvent evt) {
             if ("progress".equals(evt.getPropertyName())) {
                 progressBar.setValue((Integer)evt.getNewValue());
             }
     }
 });

 task.execute();
 System.out.println(task.get()); //prints all prime numbers we have got