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

もちろん、目標を達成するためのさまざまな方法を考え出すことができますが、このソリューションよりも多くのコードが関わっていると思いますので、試してみてください。