并发java for for循环

时间:2016-12-31 00:35:06

标签: java concurrency

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

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

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

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

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

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

希望很清楚。

2 个答案:

答案 0 :(得分: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();
}

测试将使用&#34; common&#34;中的线程并行运行。 ForkJoinPool。如果要调整使用的线程数,请创建自己的ForkJoinPool。 (有关详细信息,请参阅this question。)

答案 1 :(得分:1)

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

请参阅以下粗略示例的代码段:

<VirtualHost>
      # replace "middleware.mylinux.com:8082/hello-app-0.0.7" to "web.mylinux.com/hello"
      AddOutputFilterByType SUBSTITUTE text/html
      Substitute "s|middleware.mylinux.com:8082/hello-app-0.0.7|web.mylinux.com/hello|ni" 
</VirtualHost>
相关问题