创建n个线程,一次最多5个活动线程,等待所有线程完成后再继续

时间:2019-04-20 22:46:48

标签: java multithreading swing selenium-webdriver java-threads

我正在用Java构建具有Selenium和MVC设计模式的Web搜寻器。我正在努力实现三件事:

  1. 要创建n个线程,具体取决于存储搜索设置的数据库(sidb)的长度。

  2. 因为我的图形用户界面中有一个包含数据的TablePanel,所以我需要所有线程才能完成操作。否则我会丢失一些数据,因为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 :(得分:0)

对代码的小的更改

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();
            }


    } 

但是,是的,您最好使用线程池

例如https://howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/