[英]Concurrency java on for loop
我有一種與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();
}
正如我所說的,代碼不是實際的代碼,只是為了解決我的問題。
希望是清楚的。
我想您是在說,我要遍歷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();
}
這些測試將使用“常見” ForkJoinPool中的線程並行運行。 如果要調整使用的線程數,請創建自己的ForkJoinPool。 (有關更多信息,請參閱此問題 。)
我會為每個任務顯式啟動單獨的線程,因為大部分時間可能會花費在等待創建用戶帳戶之前。
請參見下面的代碼示例和粗略示例:
public void createAccounts() throws InterruptedException {
List<Thread> threadList = new ArrayList<>();
Object[][] myArray = new Object[1][1];
for(int i=0; i<myArray.length; i++) {
final int index = i;
//Add thread for user creation
threadList.add(new Thread(new Runnable() {
@Override
public void run() {
Webdriver.start();
WebElement.findby.(By.name("field1").sendkeys(myArray[index][2]);
Webdriver.end();
}
}));
}
//Start all threads
for (Thread thread : threadList) {
thread.start();
}
//Wait until all threads are finished
for (Thread thread : threadList) {
thread.join();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.