我正在使用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之后,它永远等待套接字上的输入。一段时间后最简单的超时方法是什么?在这种情况下,this也是最佳解决方案吗?我仍然会在该解决方案中使用swingworker吗?
由于
答案 0 :(得分:4)
是的,您链接的解决方案是一个合理而简单的解决方案(&#34;最好&#34;是如此主观:)您可以利用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
当然,您可以采用不同的方式来实现目标,但我敢打赌,与此解决方案相比,涉及的代码更多,所以我试一试。