2012-01-01 54 views
2

我有一个基于MVC的程序,它从互联网获取数据,并开始解析它,当然在我们需要线程的网络程序中。如何让我的程序等待某个特定的线程并且不影响我的GUI的交互性?

我有一个类从互联网阅读下面这样的数据:

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类已经先读取了数据,然后继续进行,我应该怎么做?

+0

您可以让WebReader线程在准备就绪(回调)时通知UI。另请参阅http://stackoverflow.com/questions/1476170/how-to-implement-callbacks-in-java – 2012-01-01 20:32:42

回答

1

没有给你确切的解决方案,我可以给你一些考虑的事情。您需要在GUI中执行某些操作以指示用户应该等待。这可能与等待/忙碌光标或某种进度监视器一样小。根据您使用的GUI技术实现这些不同。当你使用通知机制给用户时,它将有数据到达时唤醒的手段。

6

SwingWorker是一个内置机制,用于在后台线程上执行长时间运行的任务,所以EDT不会被阻塞。根据应用程序的总体设计和意图,您可能会发现比其他解决方案更容易。

编辑:我假设你的GUI在Swing中?如果不是这个答案将不适用。

+0

+1为Swing Worker。 [Concurreny](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)上的Swing教程解释了有关EDT的更多信息并提供了示例。 – camickr 2012-01-01 20:38:46

相关问题