【问题标题】:How to run java for loop in parallel?如何并行运行java for循环?
【发布时间】:2016-05-27 01:08:24
【问题描述】:

我是学习 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 个浏览器并加载该网站,但所有这些浏览器都会被杀死。

【问题讨论】:

  • 为什么你想这样做?这是专业环境中的不好的做法,如果您正在学习,最好学习好的做法。你有足够的时间养成坏习惯。
  • 20 个 Firefox 实例冲击 Google 真的不会证明太多,而且速度会非常慢。您是否正在尝试进行性能测试?
  • 我不能评论好的或坏的做法,但我的要求是并行运行线程。在这里的任何帮助表示赞赏。
  • 我们只是想弄清楚您想要实现的目标。据我们所知,您得到的建议很糟糕。
  • 仍然需要知道您要测量的内容。您是否考虑过 JMeter 或 Siege?用真正的浏览器进行测试慢了。

标签: java selenium testing automation qa


【解决方案1】:

如果您使用的是 Java-8,则可以使用parallelStream 运行并行 for 循环

 IntStream.range(0,20).parallel().forEach(i->{
         ... do something here
 });

【讨论】:

  • 谢谢,但我使用的是 Java 1.6.0_27
  • 为什么您使用 Java 1.6.0_27?它的发布日期是 2011-08-16。
  • 我试图运行它的系统是旧系统,我们不能仅仅为此对它们进行升级。
  • 好的,很公平,只要您在结果中添加警告,即这是一个非常古老且不受支持的 JDK,不应将其视为任何新工作或部署等的指南。
【解决方案2】:

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

正如人们在 cmets 中所说的那样,因此必须在我的回答中给出警告。多线程本身就是一个复杂的话题,进入这个领域必须谨慎,因为可能存在许多关于“线程安全”的问题/话题,即使这是你“应该”处理“业务请求”的方式。

无论如何,如果您真的想创建多线程的东西,那么我会指导您了解一些技术项目,以帮助您开始主题培训(以及您自己的进一步研究):您可以创建另一个类来实现可调用接口。然后它必须具有实现该接口的性质的“调用”方法。在此类和“调用”方法中,您可以将要并行发生的实际逻辑放在一起。在您的情况下,所有驱动程序等。

然后在您的父类(您从上面放置代码的那个)中,您可以使用 FixedThreadPool 和一个相关的 ExecutorService 来接受这个可调用类。它本质上将在单独的线程中运行“调用”方法,以便您的 for 循环可以在执行“调用”方法中的逻辑的同时继续向前。它将第二次创建另一个线程,等等。您可以管理使用线程池创建的线程数。您可以使用不同类型的线程池和服务等。同样,这是一个非常大的主题和领域。我只是想让你的鼻子指向一个方向,让你开始进一步研究它。

人们可能不喜欢我的回答,因为他们认为您应该使用完全不同的技术,而不是以这种方式使用 Selenium 等。我完全理解这种观点,并且不同意这些替代答案。然而,你的问题是“如何让它同时运行”,我试图给你一个基本的答案。我希望这会有所帮助!如果您需要一些指向教程或任何内容的链接,请告诉我,但谷歌“ExecutorService”“线程池”和“可调用”(或它们的组合)带有 java 和教程这个词应该可以为您提供有关该主题的各种答案。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多