Java 如何使用2个循环编写多线程代码
我正在尝试使用多线程使我的代码更快。 我有两个大数组(在上面的代码中,我以小数组为例) 这是我的代码,我尝试过,但它卡住了,什么也做不成:Java 如何使用2个循环编写多线程代码,java,multithreading,loops,Java,Multithreading,Loops,我正在尝试使用多线程使我的代码更快。 我有两个大数组(在上面的代码中,我以小数组为例) 这是我的代码,我尝试过,但它卡住了,什么也做不成: 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; i
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();
}
}
}
}
import java.io.IOException;
导入java.net.URI;
导入java.net.http.HttpClient;
导入java.net.http.HttpRequest;
导入java.net.http.HttpResponse;
导入java.util.ArrayList;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共班机{
私有ArrayList黑名单=新建ArrayList();
字符串[]城市={
“伦敦”,
“巴黎”,
“巴塞罗那”
};
字符串[]猫={
“动物”,
“工作”,
“环境”,
“B”
};
公共静态void main(字符串[]args){
Main m=新的Main();
m、 run();
}
公开募捐{
ExecutorService svc=Executors.newCachedThreadPool();
int chunks=Runtime.getRuntime().availableProcessor();
长迭代cities=cities.length;
长迭代cats=cats.length;
for(int i=0;i 对于(int i=startCities;i您试过调试吗?也许可以添加一些控制台输出/日志以查看发生了什么。并验证您的程序是否按需要运行单线程(chunks=1
)问题需要解决。正如所问,这是调试。FWIW,iterationsCats/chunks*i
应该是(iterationsCats*i)/chunks
(括号是可选的,但这是一个好主意)。现在我得到了错误:java.net.ConnectException:地址已经在使用中:没有关于client.send行的进一步信息