私がスレッド内にいて、次のような外部関数への呼び出しがあるとします
Response resp = ResponseSender.getResponse();
内で応答が得られないとしますt seconds
。要求をタイムアウトして次の行を実行する必要があります。どうすればいいですか?
私がスレッド内にいて、次のような外部関数への呼び出しがあるとします
Response resp = ResponseSender.getResponse();
内で応答が得られないとしますt seconds
。要求をタイムアウトして次の行を実行する必要があります。どうすればいいですか?
Respnse
をFuturTaskにカプセル化します。これを行うメソッドget(long timeout, TimeUnit unit)があります。
これは、コードをスレッドに入れることで簡単に取得できます。次のように開始します。
private static class TimeoutJob implements Runnable {
private Response resp;
public void run() {
resp = ResponseSender.getResponse();
}
public Response getResponse() {
return resp;
}
あなたのコードにこれを入れてください:
TimeoutJob tj = new TimneoutJob();
Thread t = new Thread(tj);
t.start();
t.join(1000); // try to join the thread so waiting for the response to comeback, having a timeout of 1000 milliseconds
if (tj.getResponse() != null) // -> you have a response...
キャッチする必要がある中断された例外があるため、このコードは 100% 完全ではありませんが、私のドリフトをキャッチします。
注: これによりタイムアウト機能が提供されますが、ResponseSender はまだ getResponse() コードを実行しており、それを中断していません。おそらく、ResponseSender クラスを再設計してタイムアウトをサポートし、タイムアウトが発生したときに適切にリソースを閉じる方がよいでしょう...
URLConnection
URL /下を使用している場合は、と を使用setConnectTimeOut
しますsetReadTimeout
。それ以外の場合は、他の回答で十分です。