java.net.URLConnection在这里经常询问使用情况,Oracle教程对此非常简洁.
该教程基本上只显示了如何触发GET请求并读取响应.它没有解释如何使用它来执行POST请求,设置请求标头,读取响应标头,处理cookie,提交HTML表单,上传文件等.
那么,我如何使用java.net.URLConnection触发和处理"高级"HTTP请求?
除了java.nio之外,java中有哪些async io(基于套接字)的选项?java.nio也使用backround中的线程(因为我认为.NET的async-socket-library确实如此,可能它已经被更改了)或者使用正确的select调用它是"真正的"async io吗?
我从类似的问答中读到了答案
如何在JAVA中创建异步HTTP请求?|
异步编程设计模式 |
AsyncTask Android - 设计模式和返回值
我看到很多解决方案,但没有一个真的让我满意.
倾听者的方式
捕获结果后,处理将在onResult方法中实现.
public interface GeolocationListener {
public void onResult(Address[] addresses);
public void onError(Exception e);
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案并不能让我满意,因为我想在main方法中处理结果.我讨厌这个接口,因为当返回响应时,它会在onResult中处理,导致处理链,无法返回"main"方法.
servlet的方式
public class SignGuestbookServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// ...
resp.sendRedirect("/guestbook.jsp");
}
}
Run Code Online (Sandbox Code Playgroud)
没有公开的Java代码调用servlet.所有配置都在web.xml中完成
我想要的方式
等待这样的回复
Response a = getResponse();
// wait until the response is received, do not go further
// process
Response b = getResponse();
// wait until the response is received, do not …Run Code Online (Sandbox Code Playgroud) 所以我有一个程序,我需要向URL发送很多(如10,000+)GET请求,我需要它尽可能快.当我第一次创建程序时,我只是将连接放入for循环中,但它确实很慢,因为它必须等待每个连接完成才能继续.我想让它更快,所以我尝试使用线程,它使它更快,但我仍然不满意.
我猜测正确的方法是使用异步连接并连接到所有URL.这是正确的方法吗?
此外,我一直在努力了解线程以及它们是如何工作的,但我似乎无法理解它.我所使用的计算机配有Intel Core i7-3610QM四核处理器.根据英特尔网站上有关该处理器的规格,它有8个线程.这是否意味着我可以在Java应用程序中创建8个线程,它们将同时运行?超过8,没有速度增加?
"性能"选项卡下任务管理器中"线程"旁边的数字究竟代表什么?目前,我的任务管理器显示"线程"超过1,000.为什么这是这个数字,如果那是我的所有处理器支持,它怎么能超过8呢?我还注意到,当我尝试使用500个线程作为测试程序时,任务管理器中的数字增加了500但它的速度与我将其设置为使用8个线程相同.因此,如果数量根据我在Java应用程序中使用的线程数增加,那为什么速度相同呢?
另外,我尝试用Java中的线程做一个小测试,但输出对我来说没有意义.这是我的Test类:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
private static int numThreads = 3;
private static int numLoops = 100000;
private static SimpleDateFormat dateFormat = new SimpleDateFormat("[hh:mm:ss] ");
public static void main(String[] args) throws Exception {
for (int i=1; i<=numThreads; i++) {
final int threadNum = i;
new Thread(new Runnable() {
public void run() {
System.out.println(dateFormat.format(new Date()) + "Start of thread: " + threadNum);
for (int i=0; i<numLoops; i++)
for (int j=0; j<numLoops; …Run Code Online (Sandbox Code Playgroud) 我正在使用 Spring RestTemplate 并想调用另一个不返回任何响应正文的服务。所以,我不想等待回应。所以,这只是一劳永逸,然后继续剩下的代码。我正在考虑创建一个新线程来执行此操作,但真的不确定什么是正确的方法。
java ×5
asynchronous ×3
http ×1
httprequest ×1
networking ×1
request ×1
response ×1
rest ×1
resttemplate ×1
sockets ×1
spring ×1