【问题标题】:Concurrency java on for loopfor循环上的并发java
【发布时间】:2016-12-31 00:35:06
【问题描述】:

我有一种与 Selenium 一起运行的方法,可以在网站上快速创建用户帐户。目前它一个接一个地处理,但我在想如果我可以一次处理10个会更好。

我目前有一个 for 循环,用于告诉其中的代码,从我的二维数组的哪一行读取用户信息。我正在努力解决如何使任何流或线程使用正确的值并获取正确的用户信息的概念。

目前我有类似于以下简化的内容:

每次循环时我都需要加载一个新页面和驱动程序,并且需要将数组的值发送到 web 字段。所以基本上我希望它开始循环,而不是在开始下一个循环之前等待第一个循环完成,但可能限制为一次运行 10 个左右。

for(i=0,i<myarray.length, i++) 
{ 
      Webdriver.start();
      WebElement.findby.(By.name("field1").sendkeys(myArray[i][2]);
      Webdriver.end();
} 

正如我所说,代码不是实际代码,它只是为了解决我的问题。

希望这很清楚。

【问题讨论】:

    标签: java concurrency


    【解决方案1】:

    我认为您是在说,我正在遍历 myArray 并为该数组中的每个元素运行一次测试,但我不想运行一个测试并等待它完成后再运行下一个测试,而是运行一个整体一次一堆。

    您可以使用 Java 8 ForkJoinPool 轻松完成此操作。

    ForkJoinTask[] tasks = new ForkJoinTask[myarray.length];
    for(i=0,i<myarray.length, i++) 
    { 
        int j = i; // need an effectively final copy of i
        tasks[i] = ForkJoinPool.commonPool().submit(() -> {
            Webdriver.start();
            WebElement.findby.(By.name("field1").sendkeys(myArray[j][2]);
            Webdriver.end();
        });
    }
    for (i = 0; i < my array.length; i++) {
        tasks[i].join();
    }
    

    测试将使用“通用”ForkJoinPool 中的线程并行运行。如果要调整使用的线程数,请创建自己的 ForkJoinPool。 (有关更多信息,请参阅this question。)

    【讨论】:

    • 对不起,也许我不清楚,或者我是,你的回答很好地解决了这个问题。所以我像 Excel 中的表格一样使用数组,所以用户数据在多列中的数组的一行中。我需要为每个测试启动一个新的 Web 驱动程序,并且有一组测试运行在每一行的不同列上。如果我把它列成一个列表,那么我可能很难确定列表中的哪个字符串是针对该特定用户的?
    • 好吧,忘记列表。我会更新答案。
    【解决方案2】:

    我会为每个任务明确启动单独的线程,因为大部分时间可能会花在等待创建用户帐户上。

    请参阅下面的粗略示例代码 sn-p:

    public void createAccounts() throws InterruptedException {
        List<Thread> threadList = new ArrayList<>();
        Object[][] myArray = new Object[1][1];
        for(int i=0; i<myArray.length; i++) {
            final int index = i;
            //Add thread for user creation
            threadList.add(new Thread(new Runnable() {
                @Override
                public void run() {
                    Webdriver.start();
                    WebElement.findby.(By.name("field1").sendkeys(myArray[index][2]);
                    Webdriver.end();
                }
            }));
        }
        //Start all threads
        for (Thread thread : threadList) {
            thread.start();
        }
        //Wait until all threads are finished
        for (Thread thread : threadList) {
            thread.join();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 2021-02-28
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多