2011-08-12 68 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 

當然,你可以想出不同的方式來達到你的目標,但我敢打賭,這個解決方案涉及的代碼更多,所以我會試一試。