如何并行运行java for循环?

时间:2016-02-15 23:23:53

标签: java selenium testing automation qa

我是新手学习selenium并在下面写了java代码。我正在尝试运行一个应该加载该站点20次的for循环。现在它按顺序循环,我想要并行运行。你能帮忙吗?

public class lenders {

   //ExtentReports logger = ExtentReports.get(lenders.class);
   public static void main(String[] args) throws InterruptedException  {

   for (int i=0; i<20; i++) {
      FirefoxDriver driver= new FirefoxDriver();
      driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.SECONDS);

      try {
         driver.get("https://www.google.com");
      } catch (TimeoutException e) {
           driver.quit();
      }
}

接近结束时,我想要打开20个浏览器并加载网站,所有这些浏览器都会被杀死。

2 个答案:

答案 0 :(得分:4)

如果您使用的是Java-8,则可以使用parallelStream

运行并行for循环
 IntStream.range(0,20).parallel().forEach(i->{
         ... do something here
 });

答案 1 :(得分:0)

一般而言,在高级别上,尝试在java中并行运行代码意味着您正在尝试运行多线程代码(一次执行多个线程)。

正如个人在评论中所说,因此我必须对我的回答发出警告。多线程本身是一个复杂的主题,必须谨慎进入这个领域,因为可能存在许多关于&#34;线程安全的问题/主题。即使这是你&#34;应该&#34;接近&#34;业务请求&#34;。

在任何情况下,如果您真的想要创建多线程的东西,那么我会指导您完成一些技术项目,让您开始主题培训(以及您自己的进一步研究):您可以创建另一个实现的类Callable接口。然后它必须有&#34;呼叫&#34;实现该接口的本质方法。在这个班级和#34;电话&#34;您可以将实际逻辑并行放置的方法。在你的情况下,所有的驱动程序等

然后在您的父类(您从上面放置代码的那个)中,您可以使用FixedThreadPool和一个接受此可调用类的关联ExecutorService。它基本上会运行&#34;呼叫&#34;在一个单独的线程中的方法,以便你的for循环可以在&#34; call&#34;中的逻辑同时继续向前方法被执行。它将第二次出现并创建另一个线程等。您可以管理使用线程池创建的线程数。您可以使用不同类型的线程池和服务等。再次,这是一个非常大的主题和领域。我只是试图让你的方向让你开始进一步研究它。

人们可能不喜欢我的答案,因为他们认为你应该使用完全不同的技术,而不是以这种方式使用Selenium等。我完全理解这种观点并且不同意这些替代答案。但是,你的问题是&#34;如何在同一时间运行#34;而且我试图给你积木的答案。我希望有所帮助!如果您需要一些教程或任何内容的链接,请告诉我,但google&#34; ExecutorService&#34; &#34;线程池&#34;和&#34; Callable&#34; (或它们的组合)与单词java和tutorial应该为您提供关于该主题的各种答案。

我希望有所帮助!