Java SwingWorker doInBackground()是否可能在继续之前等待临时过程完成

Java SwingWorker doInBackground()是否可能在继续之前等待临时过程完成,java,swing,thread-safety,swingworker,Java,Swing,Thread Safety,Swingworker,我目前正在使用一个SwingWorker来防止SwingGUI在执行一项需要一段时间才能完成的任务(Web抓取)时挂断。此外,我正在从doInBackground()调用publish()方法,将临时数据块发送到process方法,如下面的示例代码所示。但是,这给我带来了一些问题,因为process方法是异步完成的,有时会被新的数据块覆盖,从而导致一些数据消失。是否可以告诉doInBackground()等待处理/发布方法完成,并确保在继续并可能覆盖以前的数据之前,按要求处理和使用数据 clas

我目前正在使用一个
SwingWorker
来防止SwingGUI在执行一项需要一段时间才能完成的任务(Web抓取)时挂断。此外,我正在从
doInBackground()
调用
publish()
方法,将临时数据块发送到process方法,如下面的示例代码所示。但是,这给我带来了一些问题,因为process方法是异步完成的,有时会被新的数据块覆盖,从而导致一些数据消失。是否可以告诉
doInBackground()
等待处理/发布方法完成,并确保在继续并可能覆盖以前的数据之前,按要求处理和使用数据

class validateSources extends SwingWorker<Void, Integer> {

    @Override
    protected Void doInBackground() throws Exception {
        for (int i = 0; i < size; i++) {
            //Do some webscraping here

            //Publish the data to the process method
            publish(webscrapingData);
        }
    }

    @Override
    protected void process(List<Integer> chunks) {
        //Use WebscrapingData for something
        Object webscraingData = chunks.get(0);
    }
}
类验证源扩展SwingWorker{
@凌驾
受保护的Void doInBackground()引发异常{
对于(int i=0;i
编辑:


我注意到我之前提供的细节不够充分。我目前面临的问题是,在doInBackground()中继续下一次迭代之前,完全处理从doInBackground()发布的数据至关重要。因此,我正在寻找一种方法来确保process()中的代码在进行下一次Webscraping迭代之前完全完成。

阅读上的Swing教程中的部分。你会发现一个声明说:

多次调用publish的结果通常为一次调用流程而累积

您只处理单个项目


您需要遍历列表中的所有项目。

您不必在
doInBackground
上调用
publish
。您可以在
done()
上调用
get()
,您的流程方法看起来有错误,因为您可能应该迭代该方法中的chunks列表,将for循环中获得的值传递给GUI(因为该代码是在EDT上调用的)。您可能应该提供更多关于代码其余部分的详细信息,特别是在获得块数据后,您将如何处理这些数据。@cDer对于误解表示歉意,我对这个问题进行了编辑,对我目前面临的问题进行了更详细的阐述。我提出的问题似乎缺少一些细节,并且在这个问题上存在一些误解。我为此道歉。正如编辑中所写的,我目前面临的问题是process()中的代码必须在doInBackground()中的webscraping下一次迭代之前完成。因此,我正在寻找一种方法,以确保在继续之前已完全处理发布的块。然后,所有操作都需要在EDT上完成。SwingWorker的要点在于,您在后台执行一个长时间运行的任务,然后在GUI可用时发布数据。我不知道你对网络垃圾的定义是什么。通常,这意味着您解析网页上的数据,然后用解析后的信息更新GUI。所以这两个任务是不相关的。我在那里写了网页抓取,因为这是这个程序的主要目的,但我想这会让问题变得不那么明显。我实际上是在GUI中有一个ListModel。SwingWorker在列表中循环,并从列表中删除网站,以查看是否应从列表中删除该网站。如果应该删除该项,它会将该项的索引发布到process方法,并使用.removeElementAt方法从列表中删除该项。我考虑了带有偏移量变量的已删除项,但如果该项未删除且继续,它将变得混乱。它将发布该项的索引-对我来说,这听起来像是设计问题。您应该从ListModel发布该项,并在删除该项之前搜索ListModel以查找该项。那么就不需要索引了。所以SwingWorker需要列表中所有项目的副本,这样它可以一次处理一个项目,然后发布需要删除的项目。我不这么认为,但这似乎是解决问题的好办法。谢谢你的帮助,你真的救了我一天!
Object webscraingData = chunks.get(0);