java - 如何使用 2 个循环制作多线程代码
问题描述
我试图通过多线程使我的代码更快。我有 2 个大数组(在上面的代码中,我将小数组作为示例)。
这是我尝试过的代码,但它卡住了,什么也没做:
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
private ArrayList<String> blackList = new ArrayList<String>();
String[] cities = {
"London",
"Paris",
"Barcelona"
};
String[] cats = {
"Animals",
"Jobs",
"Env",
"B"
};
public static void main(String[] args) {
Main m = new Main();
m.run();
}
public void run() {
ExecutorService svc = Executors.newCachedThreadPool();
int chunks = Runtime.getRuntime().availableProcessors();
long iterationsCities = cities.length;
long iterationsCats = cats.length;
for (int i = 0; i < chunks; ++i) {
int startCities = (int) (iterationsCities / chunks * i);
int endCities = (int) (iterationsCities / chunks * (i + 1));
int startCats = (int) (iterationsCats / chunks * i);
int endCats = (int) (iterationsCats / chunks * (i + 1));
svc.execute(new Task(startCities, endCities, startCats, endCats));
}
}
public class Task implements Runnable {
int startCities;
int endCities;
int startCats;
int endCats;
public Task(int startCities, int endCities, int startCats, int endCats) {
this.startCities = startCities;
this.endCities = endCities;
this.startCats = startCats;
this.endCats = endCats;
}
public void launch() throws IOException, InterruptedException {
for(int i=startCities; i<endCities; i++)
{
for(int j=startCats; j<endCats; j++)
{
String link = "https://.../pro/search/" + cats[j] + "/" + cities[i];
//System.out.println(link);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(link))
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
//System.out.println(link);
String html = response.body();
Pattern pattern = Pattern.compile("data-count=\"([A-Za-z0-9_]*)\"");
Matcher matcher = pattern.matcher(html);
boolean matchFound = matcher.find();
if(matchFound)
{
int dataCount = Integer.parseInt(matcher.group(1));
if(dataCount == 0)
{
String l = cats[j] + "/" + cities[i];
if(!blackList.contains(l)) {
blackList.add(l);
}
}
}
}
}
}
@Override
public void run() {
try {
launch();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
我的代码发出 http 请求,在 HTML 的元标记中获取值并询问该值是否等于 0,如果是,它将 URL 保存在黑名单中。
解决方案
推荐阅读
- grails - 如何使用 Spring Security 在 Grails 应用程序中建立登录令牌
- python - 如果列具有空值,则非规范化数据是 pyspark
- algorithm - 为什么我的算法不适用于 codility 的曼哈顿天际线
- reactjs - 有没有办法处理 onSubmit 中的输入隐藏值?
- java - Eclipse null 分析在泛型参数上有@NonNull
- c++ - SDRAM STM32H7 ALIENTEK BOARD - 读/写错误
- bash - bash 脚本 - for 循环
- reactjs - 如何在 nextjs 中将 getStaticProps 重构为 getServerSideProps
- pine-script - 是否可以限制单个柱中的策略条目数量?
- reactjs - react-intl 在 redux 中重用 intl 对象