Java SwingWorker doInBackground()是否可以等待一个临时进程完成后再继续。

问题描述 投票:0回答:1

我目前使用的是 SwingWorker 以防止Swing GUI在进行一个需要一段时间才能完成的任务(Web Scraping)时挂起。此外,我还在调用 publish() 方法从 doInBackground() 来发送Interim数据块到进程方法,如下面的示例代码所示。然而,这给我带来了问题,因为进程方法是异步完成的,有时会被一个新的数据块覆盖,从而导致一些数据消失。是否可以告诉 doInBackground() 要等processpublish方法完成,确保数据按要求处理和使用后再继续,并可能覆盖之前的数据?

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);
    }
}

EDIT:

我注意到,我之前给出的细节并不充分。我目前遇到的问题是,从doInBackground()中发布的数据必须在doInBackground()中继续下一次迭代之前得到充分处理,这一点至关重要。因此,我正在寻找一种方法来确保在做下一次Webscraping迭代之前,process()中的代码完全完成。

java swing thread-safety swingworker
1个回答
1
投票

阅读Swing教程中的以下部分 有中期结果的任务. 你会发现有一个声明说。

多次调用publish的结果通常会累积到一次调用process中。

Object webscraingData = chunks.get(0);

你只处理一个项目。

你需要对列表中的所有项目进行迭代。

© www.soinside.com 2019 - 2024. All rights reserved.