Java中的SwingWorker(初学者问题)

时间:2010-03-24 23:30:48

标签: java multithreading

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

我在网上看到的有关使用SwingWorkers的所有教程都是创建的,例如

new SwingWorker<String, Void>; 

将我的声明声明为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);
    }
}

任何反馈/建议都会受到高度赞赏,因为多线程是编程的一个重要领域,我很弱。

2 个答案:

答案 0 :(得分:2)

代码似乎没问题......应该可行。也许爬行方法永远不会结束......如果您调试代码并使其运行直到返回null的行并查看爬行方法是否完成,会发生什么...

答案 1 :(得分:1)

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