可以从另一个线程安全地调用disconnect()来取消正在进行的HttpURLConnection吗?

时间:2013-04-17 19:28:58

标签: java android

如果我在工作线程中有一个java.net.HttpURLConnection正在接收数据(或即将接收数据),那么在另一个连接的生命周期的任何一点调用disconnect()来阻止它是否安全线程?

我对此感到疑惑,因为我找不到一个清楚记录的方法来中止正在进行的HTTP连接。通过调用Thread.interrupt()来中断工作线程将无效,因为您从InputStream获得的HttpURLConnection不可中断。

我做了一些看起来像这样的实验:

// MyRequest.run() gets an HttpURLConnection by calling someUrl.openConnection()
MyRequest request = new MyRequest(someUrl);

FutureTask<SomeResult> task = new FutureTask<SomeResult>(request);
someExecutor.execute(task);

// The connection opens, data comes in, ...

// Get the HttpURLConnection from the request, call disconnect()
// Should be part of the cancel() of a FutureTask subclass
request.getConnection().disconnect();    

它似乎工作,它创建的连接和套接字对象最终将被gc清理。不过,我想知道这是否是正确的方法呢?从另一个线程调用disconnect()会有任何问题吗?

2 个答案:

答案 0 :(得分:1)

如果你在任务中正确处理它,那将会有效。更好的方法是在从InputStream读取时检查任务的interruptState。

例如使用BufferedReader:

HttpURLConnection conn = null;
try {

      //open Connection

   BufferedReader br = new BufferedReader(new InputStreamReader(inputstream));
   for(String line = br.readLine(); line != null && !Thread.currentThread().isInterrupted(); line = br.readLine()) {
         //do something
   }
} catch(IOException io) {
     //error handling
} finally {
   if(conn != null)
          conn.disconnect();
}

答案 1 :(得分:0)

HttpURLConnection的文档说,&#34;此类的实例不是线程安全的。&#34;由于disconnect是一个实例方法,因此根据文档,您无法在调用与该对象相关的任何其他方法时调用它。通常,I / O线程代码几乎总是调用与HttpURLConnection相关的方法,因为这些方法在等待网络时会阻塞。

如果您进行并发呼叫,例如一般的线程安全违规,当您在最重要的客户面前非常严重地测试故障时,您可以期望它能够正常工作。 : - )