我对多线程相对较新,并希望使用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);
}
}
任何反馈/建议都会受到高度赞赏,因为多线程是编程的一个重要领域,我很弱。
答案 0 :(得分:2)
代码似乎没问题......应该可行。也许爬行方法永远不会结束......如果您调试代码并使其运行直到返回null的行并查看爬行方法是否完成,会发生什么...
答案 1 :(得分:1)
我建议您监控抓取方法的状态(它是否完成?)以及将其包装在doInBackground内的try {...} catch块中。或者从你的done方法中调用“get()”。无论哪种方式都应该允许您捕获在爬网过程中抛出的任何异常。