首页 > 解决方案 > 如何使用 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 保存在黑名单中。

标签: javamultithreadingloops

解决方案


推荐阅读