Java中的SwingWorker(初学者问题)

4

我相对于多线程还比较新,想要使用Swingworker线程执行后台任务 - 调用的方法实际上并不返回任何内容,但我希望在完成时得到通知。

从我看过的所有关于使用SwingWorkers的教程中,它们都是这样创建的:

new SwingWorker<String, Void>; 

如果没有数据返回,将我的声明为Void是否合适?

到目前为止,我所拥有的代码似乎无法正常工作:

private void crawl(ActionEvent evt)
{
    try
    {
    SwingWorker<Void, Void> crawler = new SwingWorker<Void, Void>()
    {
        @Override
        protected Void doInBackground() throws Exception
        {
            Discoverer discover = new Discoverer();
            discover.crawl();
            return null;
        }

        @Override
        protected void done()
        {
            JOptionPane.showMessageDialog(jfThis, "Finished Crawling", "Success", JOptionPane.INFORMATION_MESSAGE);
        }

    };
    crawler.execute();
    }
    catch (Exception ex)
    {
         JOptionPane.showMessageDialog(this, ex.getMessage(), "Exception", JOptionPane.ERROR_MESSAGE);
    }
}

任何反馈/建议都将不胜感激,因为多线程是我编程中薄弱的领域。

3
当你运行这段代码时会发生什么?是否会产生任何错误? - TwentyMiles
之前我完全没有意识到被抛出的错误。 - Malachi
2个回答

2

这段代码看起来没问题...应该可以工作。也许是爬取方法从未完成...如果您调试代码并运行到返回null的那一行,看看爬取方法是否结束...


Discoverer在NetBeans中是一个单独的项目,我已将其添加为共享项目 - 但是,它所依赖的库在GUI中不存在,因此这会导致错误。一旦将其复制到GUI项目中,问题得以解决,现在一切都正常工作。 - Malachi

1
我建议您监控爬行方法的状态(它是否完成?),并将其包装在您的doInBackground中的try {...} catch块中。或者从您的done方法中调用“get()”。无论哪种方式,都应该允许您捕获在爬行期间抛出的任何异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接