gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:38 25 4
gpt4 key购买 nike

如果我有一个正在工作线程中接收数据(或即将接收数据)的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com