【发布时间】:2020-11-25 03:34:57
【问题描述】:
大家好,我有一个客户想检查他们网站的变化。他们有 500 万个 URL 需要检查。如果我要同步发送请求/ping,我需要 23 天。所以我正在寻找一个多线程的解决方案。我最初是在 Python 中解决这个问题的,但没有看到太大的改进/无法很好地扩展,所以我在 Java 中,如果这也失败了,我会在认输之前在 Go 中尝试。 em>
问题是我没有看到多线程有任何改进。也许我执行错了,有人可以帮助我吗?
编辑:
我只是在这里进行编辑,新来的人可以查看这篇文章的历史,看看我是如何解决这个问题的。
这是套接字建议,当我尝试在线程中运行它时失败,不确定我在这里也做错了什么。
主类:
package com.company;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
public class Main extends Thread{
public static void main(String[] args) throws IOException {
long startTime = System.nanoTime();
Helpers.get("www.google.com", 80); // works here
String path = "test.txt";
boolean append = true;
for (int x = 0; x < 1; x++) {
ArrayList<String> urls = new ArrayList<String>();
// when x = 0, y = 0 | 10 /\ when x = 1, y = 10 | 20
for (int y= x * 10;y < ((x + 1) * 10); y++){
urls.add(String.format("www.google%d.com/", y)); // doesn't work here
}
Thread thread = new Thread(new Helpers(path, append, urls, 80));
thread.start();
thread.interrupt();
}
long endTime = System.nanoTime();
long duration = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);
System.out.println(duration + " ms");
}
}
助手类:
package com.company;
import java.io.IOException;
import java.net.*;import java.io.FileWriter;
import java.io.PrintWriter;import java.util.ArrayList;
public class Helpers extends Thread{
public Helpers(String path, boolean append, ArrayList<String> urls, int port) throws IOException {
this.run(path, append, urls, port);
}
public void run(String path, boolean append, ArrayList<String> urls, int port) throws IOException {
for (String url : urls) {
String status = Helpers.get(url, port);Helpers.writeToFile(path, append, status);
System.out.println(status);
}
}
public static String get(String url, int port) throws IOException {
try {
Socket conn = new Socket(url, 80);
conn.close();
return url + " | Success";
}catch (UnknownHostException error){return url + " | Failed";
}
}
【问题讨论】:
-
您正在泄漏连接。如果您设法得到它,您至少需要关闭
HttpURLConnection的输入流。 -
@MarquisofLorne 对不起,我不太明白,你能举个例子吗?
-
HttpURLConnection的使用示例,更简单的one
-
使用
ForkJoinPool/CompletableFuture来利用你的cpu 的核心(人们现在往往有更多),然后你需要将你的任务写成Runnable对象。从那时起,您需要从任务运行的角度考虑设计,而不会相互碰撞;共享资源需要是原子的或锁定的,并且您处理信息的方式可能会有所不同。例如,也许您有 4 个工作线程,其唯一目的是为您的 cpu 提供尽可能多的 http 连接(它们收到请求,添加到他们的队列并提供结果) -
@Lebecca 感谢您提供的示例,我认为我按照他们的方式实现了它,但我认为它对性能的影响不大。
标签: java multithreading httpurlconnection