http投稿要求を出し、応答を得るまで待っているスレッドをどのように殺すかについての提案。私は、リクエストからの応答を受け取る前に、このスレッドを並列実行している別のスレッドから強制終了したい。私は、HTTP POSTリクエストを閉じるか中止するかの提案を受けましたが、うまくいきませんでした。誰かがこのシナリオでhttpリクエストを中止するにはどうすればいいか、あるいはこれを達成するための他の方法を提案できます。他のスレッドからhttpリクエストを行っているスレッドをキャンセルする方法
答えて
要求を行ったスレッドは、サーバーの応答を待つ間にブロックされます。スレッドダンプを取得して参照すると、read()メソッドではなくThread.sleepになります。したがって、interrupt()を呼び出すことは効果がありません(InterruptibleChannelでない限り)。 POSTリクエストが行われたソケットまたは出力ストリームにアクセスできますか?そうであれば、それを閉じることができます。これにより、例外が発生して読み込み待機から復帰します。 置くことができるコードサンプルがありますか?
私たちが状態待ち状態になるのを待っている間にスレッド上でthread.getState()を実行するのは正しいです。そのため、割り込みがトリガされると、スレッドの割り込みフラグはセットされますが、要求を終了した後にスレッドは正常に終了します。 –
Apache HTTPクライアントを使用していて、私はasynchttpを使用できません。私は –
Apache HTTPクライアントを使用して要求してみました。私はasynchttpを使用できません。私は1つのスレッドを使用してリクエストを送信しようとしました。例:ReqThreadとリスナースレッドをキャンセルします。CancelThreadと私はhttpPostオブジェクトを保持する共有変数オブジェクトを持っています。実際の要求はクラスAで発生し、要求を送信するためにReqThreadによって送信されたhttpPostを使用します。 CancelThreadでcancelイベントリスンの実装を取り消して、** httppost.abort()**を発行する共有オブジェクトのReqThreaadによって設定されたhttpPostを読み込みます。ここで、IamがhttpPostオブジェクトをnullとして取得する問題があります。 –
皆さん、最後に、このクローズドソケットアイデアが実装され、機能しています。以下は私が試したスニペットです。
私の要求しているスレッドの取り消し
package com.pkg.myhttptest;
import org.apache.http.client.methods.HttpPost;
public class RequestThread implements Runnable{
Message msg = null;
Util util = null;
public RequestThread(Message msg, Util util) {
this.msg = msg;
this.util = util;
}
public void run() {
System.out.println("its request thread");
util.print(msg);
}
}
スレッド
public class CancelThread implements Runnable {
Message msg = null;
Util util = null;
public CancelThread(Message msg, Util util) {
this.msg = msg;
this.util = util;
}
public void run() {
System.out.println("its cancel thread");
int i=0;
while(i<5){
System.out.println("looping" + i);
i++;
}
System.out.println(msg.getHttpost() + "In cancelled");
Header[] hdr = msg.getHttpost().getAllHeaders();
System.out.println(hdr.length + "length");
msg.getHttpost().abort();
System.out.println(msg.getHttpost().isAborted());
}
}
共有オブジェクト
public class Message {
HttpPost httpost;
public HttpPost getHttpost() {
return httpost;
}
public void setHttpost(HttpPost httpost) {
this.httpost = httpost;
}
}
Utilのクラス
public class Util {
private final String USER_AGENT = "Mozilla/5.0";
public void print(Message msg) {
String url = "https://selfsolve.apple.com/wcResults.do";
HttpPost post = new HttpPost(url);
HttpClient client = HttpClientBuilder.create().build();
post.setHeader("User-Agent", USER_AGENT);
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
urlParameters.add(new BasicNameValuePair("cn", ""));
urlParameters.add(new BasicNameValuePair("locale", ""));
urlParameters.add(new BasicNameValuePair("caller", ""));
urlParameters.add(new BasicNameValuePair("num", "12345"));
try {
post.setEntity(new UrlEncodedFormEntity(urlParameters));
msg.setHttpost(post);
HttpResponse response = client.execute(post);
System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
} catch (UnsupportedEncodingException e) {
} catch (IOException e) {
e.printStackTrace()
}
}
の
メインクラス
public class App
{
public static void main(String[] args)
{
Message msg = new Message();
Util util = new Util();
Thread reqThread = new Thread(new RequestThread(msg, util));
Thread cancelThread = new Thread(new CancelThread(msg, util));
System.out.println("Starting Threads");
reqThread.start();
try {
reqThread.sleep(2000);
cancelThread.start();
cancelThread.join();
System.out.println("closing..");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
私は同意するが、それは動作します。その少し汚れたコード。それは以下の例外をもたらし、スレッドを殺します。
java.net.SocketException: Socket is closed
at java.net.Socket.getInputStream(Socket.java:876)
at sun.security.ssl.SSLSocketImpl.doneConnect(SSLSocketImpl.java:644)
at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:549)
私を助けてくれた皆さん、ありがとうございます。
- 1. 他のスレッドからスレッドを停止する方法
- 2. スレッドをキャンセルする方法C#
- 3. Androidスレッド - 別のスレッドからスレッドを実行し、ハンドラメッセージを待っています
- 4. スレッド内から非同期スレッドをキャンセルする
- 5. 私のiPhoneアプリでバックグラウンド実行スレッドをキャンセルする方法
- 6. httpリクエストをキャンセルする方法
- 7. 角$ httpリクエストをキャンセルする方法1.5
- 8. あるスレッドから他のスレッドで実行するメソッドを呼び出す
- 9. 他のスレッド内でスレッドを開始する方法
- 10. 他のスレッドからhttpセッションを閉じる
- 11. 他のスレッドが実行されるのを待っているUIスレッド - 動作していない
- 12. スレッドがだから私はこのスレッドを持っている他のクラスから
- 13. 別のスレッドにあるxmlの解析をキャンセルする方法
- 14. 別のスレッドからC#スレッドを監視する方法
- 15. スレッドでURLから画像を読み込み、deallocでスレッドをキャンセルする方法
- 16. タスクを待っている並行スレッド
- 17. 親スレッドから子スレッドを削除する方法 - C
- 18. 他のスレッドからTcpClientをリッスンするスレッドを停止するC#
- 19. 他のスレッドからBindingSourceにアクセスする
- 20. あるスレッドから他のスレッドへの値の取得
- 21. (iphone)performSelectorInBackgroundのスレッドをキャンセルする
- 22. 新しいスレッドでhttpリクエストを送信するC++
- 23. Javaでスレッドを停止、一時停止、キャンセルする方法
- 24. 他のスレッドがハングしているJavaスレッドがぶら下がっています(続き)
- 25. 他のスレッドがそのメソッドの実行を完了するまでスレッドを待機させる方法
- 26. 別のスレッドから送信されたHTTPリクエスト情報を追加する
- 27. 私のPythonスレッド同士がリクエストをかけ合っているのですか?
- 28. 複数のHTTPリクエストを同時にスレッドで使用する
- 29. 他のスレッドが実行されていないときに複数のスレッドを実行しますか?
- 30. Asp.net C#:他のスレッドがスレッド内で実行されているかどうかを確認します。
'Thread.interrupt'を試してください。 – talex
スレッドを停止する唯一の方法は、スレッドを中断する方法です。スレッドのrunメソッドが割り込みに正しく応答するか、そうでないかのどちらかです。そうでなければ、あなたができることは他にありません。 – VGR
https://stackoverflow.com/questions/3000214/java-http-client-request-with-defined-timeoutまた、非同期httpを見ましたか? – efekctive