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)
3条答案
按热度按时间pu3pd22g1#
发出请求的线程在等待服务器响应时被阻止。如果获取线程转储并查看,它将位于某个read()方法中,但不在thread.sleep中。因此,调用interrupt()不会产生影响(除非它是interruptablechannel)。您有权访问发出post请求的套接字或输出流吗?如果是这样,您可以关闭它,它将带出一个异常的读取等待。你有一个代码样本可以放上去吗?
laximzn52#
我想解决同样的问题。我编写了一个http请求runnable,它花了20秒超时并在一个线程(第一个线程)上执行。我在一个单独的线程(第二个线程)上编写了一个timeout runnable,它应该在10秒后中断/停止第一个线程。对于主线程中的每一秒(总共3个线程),我打印线程的状态,发现第一个线程一直在运行。
这是输出
我使用shareddata类来保存两个线程所需的信息。通过添加终止线程所需的额外信息(即httpget),我可以让监视线程执行实际终止线程所需的任何操作(即调用httpget.abort)。这是修改后的代码(修改后的行以//mod结尾)
这是修改后的输出
omhiaaxx3#
大家好,终于实现了这个关闭套接字的想法。下面是我试过的片段。
我的请求线程
取消线程
共享对象
util类
主要类别
我同意这是一个小小的不干净的代码,但它是有效的。它导致以下异常并终止线程。
感谢所有努力帮助我的人。