Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在发出HTTP请求时用java实现超时的最佳方法_Java_Multithreading_Networking - Fatal编程技术网

在发出HTTP请求时用java实现超时的最佳方法

在发出HTTP请求时用java实现超时的最佳方法,java,multithreading,networking,Java,Multithreading,Networking,在java.net.Socket上使用setSoTimeout更好,还是使用ExecutorService将进行Http调用的服务包装为另一个类,并使用Futures管理方法超时更好 更好目前被定义为良好实践/更可靠/准确。不一定要考虑对性能的影响,除非影响很大 编辑:为了更清楚,还应该提到java.net.Socket上的connect(SocketAddress端点,int timeout)方法。两者都没有?使用HttpURLConnection.setReadTimeout()和setCo

在java.net.Socket上使用setSoTimeout更好,还是使用ExecutorService将进行Http调用的服务包装为另一个类,并使用Futures管理方法超时更好

更好目前被定义为良好实践/更可靠/准确。不一定要考虑对性能的影响,除非影响很大


编辑:为了更清楚,还应该提到java.net.Socket上的connect(SocketAddress端点,int timeout)方法。

两者都没有?使用
HttpURLConnection.setReadTimeout()
setConnectTimeout()
BenG——我认为这是一个“取决于您想要什么”的场景——如果您在并发libs上进行规范化,这很好,但您需要自己管理关闭套接字

如果你想使用超时,它会帮你的

如果您在代码中的任何地方都使用并发lib,并且它们感觉非常自然,那么您可以自己手动管理套接字


在技术上(如果你看一下套接字内部的代码),这两者都没有什么大的优势。只要确保在将来处理套接字状态时,能够捕获潜在的IOException,这样处理将来的IOException就不会潜在地破坏执行线程。

由于HttpURLConnection使用了我提到的套接字方法,我想您是在提倡使用这些方法。你能详细解释一下为什么这是一个更好的方法吗?@BenG-因为你通常不应该直接使用套接字来做http。有很多图书馆已经做到了这一点。我提到的类是jdk的一部分。它是一行额外的代码,触发内核中预先存在的特性,加上一个catch块,而不是启动另一个线程,线程堆栈有自己的成本,还有大量自定义代码。当然,
Future
方法实际上并没有终止读取。@EJP,超时只是调用套接字上的close(),它调用内核来执行实际的套接字关闭,对吗?我不确定您是否说超时(现在JDK中的实现方式)比自己调用方法更神奇。我完全同意在运行的VM中代码和开销更少(根据您给出的原因),但我只是想确保这里没有两个单独的“关闭”代码路径被执行。从我通读的代码中,我没有看到这一点。