为什么 WebDriverManager 在使用 Threadpool 和 CountDownLatch 时不同步?



我正在尝试使用WebDriverManager运行Selenium Webdriver多线程测试(参考采取->https://www.programcreek.com/java-api-examples/?api=io.github.bonigarcia.wdm.WebDriverManager

@Test 
public void test() throws InterruptedException {
private int NUM_DATA =2;
private int NUM_LATCH=2;
private int POOL_SIZE=2;
CountDownLatch latch = new CountDownLatch(NUM_LATCH);
ExecutorService executorService = newFixedThreadPool(POOL_SIZE);

for (int i = 0; i < NUM_DATA; i++) {
executorService.submit(() -> {
try {
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);
driver.get(
"https://bonigarcia.github.io/selenium-jupiter/");
String title = driver.getTitle();
System.out.println(title);
driver.quit();
} finally {
latch.countDown();
}
});
}
latch.await();
executorService.shutdown(); }

In my case

  1. NUM_LATCH = POOL_SIZE = NUM_DATA ==>工作很好
  2. NUM_LATCH = 2 = POOL_SIZE, NUM_DATA =6 =>并非所有实例都为trhead
  3. 关闭。
  4. NUM_LATCH = NUM_DATA = 6, POOL_SIZE = 2 =>工作很好

working fine在这里的意思是,所有的浏览器实例都打开并执行,然后所有的浏览器都关闭。

我的问题陈述是,如果我有1000组NUM_DATA和POOL_SIZE是10的时间。我必须设置NUM_LATCH总是等于NUM_DATA吗?

根据"https://www.baeldung.com/java-countdown-latch">

中的文章"如果我们正在进行一些并行处理,我们可以实例化CountDownLatch,其计数器值与我们想要跨线程工作的线程数相同">

,但这里我们没有设置NUM_LATCH = POOL_SIZE,而是NUM_LATCH = Num_Data_Set的数量。这是使用CountDownLatch的正确方法吗?

我必须设置NUM_LATCH总是等于NUM_DATA吗?

不然怎么讲得通呢?门闩的目的是什么?NUM_DATA是提交给执行器的任务数。我假定您希望主线程中的latch.await()调用在所有这些任务完成时返回。对吗?如果这是您想要的,那么闩锁的初始值最好等于NUM_DATA。

我认为你不应该声明NUM_LATCH,而应该简单地写new CountDownLatch(NUM_DATA)。这使得其他阅读你代码的人很清楚,你需要锁存的初始值等于任务的数量。

最新更新