看起来SocketChannel
支持中断,但常规套接字不支持。
是否存在任何能够使用SocketChannel
而不是Socket
的java HTTP客户端。
我想支持在从服务器读取时中断线程,目前在使用URL#openConnection()
时,如果线程一直在等待服务器的响应,则无法通过中断线程来解除阻塞。
我自己从未使用过它,但看起来最符合您需求的是一个无阻塞的HTTP客户端。我所知道的唯一实现是基于Netty的Spring反应式客户端:reactor Netty。
它应该允许你做这样的事情:
final Mono<HttpClientResponse> futureResponse = HttpClient.create()
.baseUrl("http://example.com")
.get()
.response();
final Disposable httpHandle = response.subscribe(
response -> onSuccess(response),
response -> onError(response)
);
// When you want to force disconnection
httpHandle.dispose();
注意:但是要小心,因为我真的没有意识到这个系统的局限性。不过,Spring团队提供了高级文档来提供帮助。