![](/img/trans.png)
[英]Why shutdownNow() method is able to break for-loop inside Callable object, but fails to do so inside Runnable, unless we specifically call break?
[英]Runnable inside for-loop
我想在線程的for循環內運行代碼,因為它幾乎可以執行相同的操作,但適用於不同的頁面(使用Selenium Webdriver)。 我的問題是,我的計數器變量無法增加,因為它必須是最終變量。
這是我的測試代碼,但變量“ tabCount”始終保持為i。
// scrape over all tabs and get data in threads
for (int i = 0; i < tabs.size(); i++) {
final int tabCount = i;
Runnable r = () -> {
webDriver.switchTo().window(tabs.get(tabCount));
System.out.println(webDriver.getTitle());
};
threadPool.execute(r);
}
threadPool.shutdown();
try {
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
有人可以幫助我在chromedriver的每個標簽頁中並行執行相同的操作嗎?
我認為您走錯了兔子洞。 查看您的代碼:
webDriver.switchTo().window(tabs.get(tabCount));
System.out.println(webDriver.getTitle());
您希望webDriver 切換到另一個窗口。 然后在該選項卡上執行某些操作。 但是,如果第一行和第二行之間存在線程的上下文切換該怎么辦?
如:
webDriver.switchTo()
webDriver.switchTo()
顯然,這將導致比賽條件! 當然,您可以添加某種類型的鎖定/同步,以便線程始終切換到選項卡並執行其工作,而另一個線程無法同時更新webDriver對象。 但這基本上可以序列化您的測試。
長話短說:該webDriver
對象具有內部狀態。 您的方法完全忽略了這一事實,因此無法預測代碼將要執行的操作。
一個簡單的解決方法是按照注釋中的建議在每個線程中實例化一個WebDriver實例。 除此之外,有關如何以不同於硒“思考”並行測試的方式的想法,請參見此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.