因此,我制作了一个程序,需要向 URL 发送大量(例如 10,000 多个)GET 请求,并且我需要它尽可能快。当我第一次创建程序时,我只是将连接放入一个 for 循环中,但它真的很慢,因为它必须等待每个连接完成才能继续。我想让它更快,所以我尝试使用线程,它使它更快一些,但我仍然不满意。
我猜想解决这个问题并使其真正快速的正确方法是使用异步连接并连接到所有 URL。这是正确的方法吗?
另外,我一直在尝试理解线程以及它们是如何工作的,但我似乎无法理解。我使用的计算机具有 Intel Core i7-3610QM 四核处理器。根据英特尔网站上关于这款处理器的规格,它有 8 个线程。这是否意味着我可以在 Java 应用程序中创建 8 个线程并且它们都将同时运行?超过8个就不会提速了?
任务管理器“性能”选项卡下“线程”旁边的数字到底代表什么?目前,我的任务管理器显示“线程”超过 1,000。为什么它是这个数字,如果我的处理器支持它,它怎么能超过 8?我还注意到,当我尝试使用 500 个线程作为测试的程序时,任务管理器中的数字增加了 500,但它的速度与我将其设置为使用 8 个线程的速度相同。因此,如果数量根据我在 Java 应用程序中使用的线程数而增加,那么为什么速度相同?
另外,我尝试用 Java 中的线程做一个小测试,但输出对我来说没有意义。这是我的测试课:
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; j++);
System.out.println(dateFormat.format(new Date()) + "End of thread: " + threadNum);
}
}).start();
Thread.sleep(2000);
}
}
}
这会产生如下输出:
[09:48:51] Start of thread: 1
[09:48:53] Start of thread: 2
[09:48:55] Start of thread: 3
[09:48:55] End of thread: 3
[09:48:56] End of thread: 1
[09:48:58] End of thread: 2
为什么第三个线程立即开始和结束,而第一个和第二个线程各需要 5 秒?如果我添加了 3 个以上的线程,那么 2 以上的所有线程都会发生同样的事情。
对不起,如果这是一个长篇阅读,我有很多问题。提前致谢。