0

私がスレッド内にいて、次のような外部関数への呼び出しがあるとします

Response resp = ResponseSender.getResponse();

内で応答が得られないとしますt seconds。要求をタイムアウトして次の行を実行する必要があります。どうすればいいですか?

4

3 に答える 3

2

RespnseFuturTaskにカプセル化します。これを行うメソッドget(long timeout, TimeUnit unit)があります。

于 2013-08-29T07:18:57.037 に答える
0

これは、コードをスレッドに入れることで簡単に取得できます。次のように開始します。

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 クラスを再設計してタイムアウトをサポートし、タイムアウトが発生したときに適切にリソースを閉じる方がよいでしょう...

于 2013-08-29T07:22:02.020 に答える
0

URLConnectionURL /下を使用している場合は、と を使用setConnectTimeOutしますsetReadTimeout。それ以外の場合は、他の回答で十分です。

于 2013-08-29T07:23:14.407 に答える