我有一个基于MVC的程序,它从互联网上获取数据并开始解析它,当然在网络程序中我们需要有线程。
我有一个从互联网上读取数据的类,如下:
public class WebReader extends Thread
{
private String result="";
public String getResult()
{
return result;
}
public void setResult(String t)
{
result = t;
}
public WebReader(get args here)
{
//initializing
}
public void getData()
{
//call the big getData(args);
}
public void getData(Sargs)
{
//magics happens here
}
@Override
public void run()
{
//call getData()
}
}
和使用这个类在我的模型中,我一直使用下面的代码:
//inside a function
WebReader wr = new WebReader(args);
wr.start();
wr.join();
String s = wr.getResult();
this.parseData(s);
我知道通过使用join(),我将线程连接到当前线程,通过这样做,我的GUI将卡住,直到完成结果来自网络。但我想确保WebReader类已经读取了数据,然后继续,我该怎么做呢?
SwingWorker是一个内置机制,用于在后台线程上执行长时间运行的任务,这样EDT就不会被阻塞。根据应用程序的总体设计和意图,您可能会发现它比其他一些替代解决方案更容易。
编辑:我假设你的GUI是在Swing…?
不给你确切的解决方案,我可以给你一些考虑。您需要在GUI中做一些事情来指示用户应该等待。这可以是一个等待/繁忙游标,或者某种进度监视器。根据所使用的GUI技术,实现这些功能是不同的。当您对用户使用通知机制时,它将有一种在数据到达时唤醒的方法。