2011-08-12 70 views
4

我正在使用SwingWorker通过TCP连接读取数据,并在返回时显示。Swingworker Timeout

new SwingWorker<EnvInfoProto, Void>() { 
    @Override 
    public EnvInfoProto doInBackground() { 
    try { 
     xxx.writeTo(socket.getOutputStream()); 
     return ProtoMsg.parseFrom(socket.getInputStream()); 
    } catch(IOException ignore) { } 
    return null; 
    } 

    @Override 
    public void done() { 
    try { 
     UpdateGui(get()); 
    } catch (Exception ignore) {} 
    } 
}.execute(); 

问题出现在插座死了, writeTo之后,它会永久等待输入到套接字上。一段时间后最简单的方法是什么?在这种情况下,this也是最好的解决方案吗?我仍然会在该解决方案中使用回转工人吗?

感谢

回答

4

是,该解决方案您链接到一个合理的和简单的解决方案(“最好”是如此主观的:)你可以利用SwingWorker#get,这是未来界面的一部分:

SwingWorker<EnvInfoProto, Void> worker = new SwingWorker<EnvInfoProto, Void>() { 
    ... 
}; 
worker.execute(); 
worker.get(15, TimeUnit.SECONDS); 
//will block 15 seconds at most, then throw TimeoutException 

当然,你可以想出不同的方式来达到你的目标,但我敢打赌,这个解决方案涉及的代码更多,所以我会试一试。