2016-12-31 5 views
0

У меня есть метод, который работает с Selenium для быстрого создания учетных записей пользователей на веб-сайте. В настоящее время он обрабатывается один за другим, но я думаю, что если я смогу обработать 10 сразу, это будет лучше.Concurrency java on for loop

У меня есть цикл for, который используется для указания кода внутри, в какой строке моего 2D-массива читается информация пользователя. Я борюсь с концепцией того, как заставить поток или поток использовать правильное значение и получать правильную информацию пользователя.

В настоящее время у меня есть что-то похожее на ниже упрощена:

Мне нужно, чтобы загрузить новую страницу и драйвер каждый раз это петли и нужно отправить значение массива на веб-поле. Поэтому в основном я хочу, чтобы это отключилось, и цикл не дождался завершения первого цикла до начала следующего цикла, но, вероятно, ограничится 10 или около того сразу.

for(i=0,i<myarray.length, i++) 
{ 
     Webdriver.start(); 
     WebElement.findby.(By.name("field1").sendkeys(myArray[i][2]); 
     Webdriver.end(); 
} 

Как я уже сказал, код не является фактическим кодом, это просто вопрос.

Надеюсь, что это ясно.

ответ

1

Я думаю, вы говорите, я повторяю через 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. (См. this question для получения дополнительной информации.)

+0

жаль, может быть, я не ясно, или, возможно, я и ваши адреса ответить на этот вопрос хорошо. Поэтому я использую массив как таблицу в Excel, поэтому данные пользователей находятся в одной строке массива во многих столбцах. Мне нужно запустить новый веб-драйвер для каждого теста, и есть массив тестов, запускающих разные столбцы для каждой строки. если я сделаю это список, то я могу попытаться определить, какая строка в списке для этого конкретного пользователя? –

+1

Хорошо, забудьте о списке. Я обновлю ответ. –

1

Я бы прямо начал отдельный поток для каждой задачи, так как большая часть времени, вероятно, будет потрачена на ожидание, пока не будет создана учетная запись пользователя.

Пожалуйста, смотрите фрагмент кода с шероховатой пример ниже:

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(); 
    } 
}