Swingworker超时问题

4
我正在使用SwingWorker通过TCP连接读取数据,当数据返回时显示它。
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之后,它会永远等待套接字上的输入,这就出现了问题。有什么最简单的方法可以在一段时间后超时?在这种情况下,这个是否也是最佳解决方案?在那个解决方案中,我还需要使用swingworker吗?
谢谢
1个回答

4

是的,你提供的解决方案是一个合理且易于实现的方案(“最好”的评价因人而异 :) )。您可以利用SwingWorker#get,它是Future接口的一部分:

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

当然,你可以想出不同的方法来达到你的目标,但我敢打赌这种解决方案需要更多的代码,所以建议尝试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接