如果我有一个正在工作线程中接收数据(或即将接收数据)的 java.net.HttpURLConnection
,调用 disconnect()
是否安全在另一个线程中连接生命周期的任何时候停止它?
我对此感到疑惑,因为我找不到明确记录的方法来中止正在进行的 HTTP 连接。通过调用 Thread.interrupt()
中断工作线程将不起作用,因为您从 HttpURLConnection
获得的 InputStream
不可中断。
我做了一些看起来像这样的实验:
// 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()
会有什么问题吗?
最佳答案
如果您在任务中正确处理它,那将起作用。更好的方法是在读取 InputStream 时检查任务的中断状态。
以 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();
}
关于java - 是否可以从另一个线程安全地调用 disconnect() 来取消正在进行的 HttpURLConnection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068564/