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行的进一步信息