Создайте n потоков, максимум 5 активных одновременно, дождитесь завершения всех, прежде чем продолжить - PullRequest
0 голосов
/ 21 апреля 2019

Я создаю веб-сканер с шаблоном проектирования Selenium и MVC на Java.Я пытаюсь достичь трех вещей:

  1. Чтобы создать n потоков в зависимости от длины моей базы данных (sidb), хранящей настройки поиска.

  2. Поскольку в моем графическом интерфейсе пользователя есть табличная панель с данными, мне нужно завершить все потоки, прежде чем продолжить.В противном случае я потеряю некоторые данные, потому что метод table.refresh () вызывается на раннем этапе.

  3. Поскольку более чем 5 запущенных одновременно окон Firefox слишком сильно замедляют работу компьютера, я бы хотелмаксимум 5 потоков, работающих в любой момент времени.

Следующий код решает первую проблему и в некоторой степени вторую.Мне пришлось сделать неприятный Thread.sleep (), чтобы он не запускал обновление на столе слишком рано.

public void runSearchItems() {
        for (int i = 0; i < sidb.getSize(); i++) {
            final int num = i;
            Thread tn = new Thread(new Runnable() {

                @Override
                public void run() {
                    if (sidb.getSearhItem().get(num).getFormevent().getDomainBox().equalsIgnoreCase("www.someURL.com") == true) {
                        String searchField = sidb.getSearhItem().get(num).getFormevent().getSearchField();
                        int searchCat = sidb.getSearhItem().get(num).getFormevent().getSearchCategory();
                        boolean defect = sidb.getSearhItem().get(num).getFormevent().isDefectCheck();
                        boolean region = sidb.getSearhItem().get(num).getFormevent().isRegionCheck();
                        String arrange = sidb.getSearhItem().get(num).getFormevent().getArrangeBy();
                        ArrayList<SiteData> ls = wb.searchWebSite(searchField, searchCat, defect, region, arrange);
                        for (int j = 0; j < ls.size(); j++) {
                            db.addSiteData(ls.get(j));
                        }
                    }
                }
            });
            tn.start();
            try {
                tn.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

Как правильно это сделать?

Спасибо!

1 Ответ

0 голосов
/ 21 апреля 2019

Небольшие изменения в вашем коде

public void runSearchItems() { 
    List<Thread> allThreads = new ArrayList<>();


        for (int i = 0; i < sidb.getSize(); i++) {
            final int num = i;
            Thread tn = new Thread(new Runnable() {

                @Override 
                public void run() { 
                    if (sidb.getSearhItem().get(num).getFormevent().getDomainBox().equalsIgnoreCase("www.someURL.com") == true) {
                        String searchField = sidb.getSearhItem().get(num).getFormevent().getSearchField();
                        int searchCat = sidb.getSearhItem().get(num).getFormevent().getSearchCategory();
                        boolean defect = sidb.getSearhItem().get(num).getFormevent().isDefectCheck();
                        boolean region = sidb.getSearhItem().get(num).getFormevent().isRegionCheck();
                        String arrange = sidb.getSearhItem().get(num).getFormevent().getArrangeBy();
                        ArrayList<SiteData> ls = wb.searchWebSite(searchField, searchCat, defect, region, arrange);
                        for (int j = 0; j < ls.size(); j++) {
                            db.addSiteData(ls.get(j));
                        } 
                    } 
                } 
            }); 


            allThreads.add(tn);
        } 



        for(Thread t:allThreads)
            t.start();


        for(Thread t:allThreads)
            try { 
                t.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block 
                e.printStackTrace();
            }


    } 

Но да, лучше с Thread Pool

в качестве примера https://howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/

...