2016-04-19 5 views
1

funktioniert Ich mache smth wie:Groovy/SoapUI: Loop Innengewinde nicht

Iterator<String> iterator = requestList.iterator() 

    (1..threadCount).each { 

     Thread.start { 

      while(iterator.hasNext()) { 
       log.info iterator.next() 
       Thread.sleep(50) 
      } 
     } 
    } 

Da threadCount = 10 und requestList is ~115 erwarte ich, dass alle Themen zur Ausgabe die ganze Liste, jedes Mal Iterator zu fragen, ihnen zu geben Nächster.

Allerdings habe ich kaum bekommen sogar 10 Protokolle, in der Regel 8.

Alles in SoapUI groovy Scriptschritt durchgeführt wird, statt log.info Ich habe nämlich eine REST-Anfrage mit der Nummer N.

auslösenden

Was mache ich falsch mit diesen Threads?

UPD

Okay, hat wie diese smth dumm, zu testen (und vermeiden ein Array):

def array1 = all[0..5] 
def array2 = all[6..11] 


Thread.start{ 

    for(String r: array1) { 
     log.info r 
    } 
} 

Thread.start{ 

    for(String r: array2) { 
     log.info r 
    } 
} 

Und ich habe jetzt keine Ausgabe an alle oder ein Protokoll höchstens, obwohl ich 12 erwarte. Wie erstelle ich Threads, die Daten gleichzeitig ausgeben?

NOCH MEHR

def threadCount=10 

(0..threadCount).each { n -> 

Thread.start { 

    (1..10).each { 
     log.info "thread"+n+" says| "+it 
    } 
} 
} 

Ausgang ist:

thread0 says| 1 
thread3 says| 1 
thread8 says| 1 
thread2 says| 1 
thread1 says| 1 
thread9 says| 1 
thread7 says| 1 
thread5 says| 1 
thread4 says| 1 
thread0 says| 2 

und nichts mehr. Wieder was ist los mit mir oder groovy? (hoffe, groovy ist in Ordnung)

+1

hinzuzufügen, dies auch zu Race-Bedingung und ein Datum Rennen führen wird, weil die Iteratorobjekt von allen Threads ohne Synchronisation gemeinsam genutzt wird. Die Ausgabe ist also unvorhersehbar. – Madhusudhan

+0

Sie sind auf eine Thread-Sicherheitsfrage gestoßen. Eine verwandte Frage ist diese: http://stackoverflow.com/questions/5847939/is-list-iterator-thread-safe – Danilo

+0

Über Ihre Aktualisierung, definieren Sie die Arrays richtig, um die Ausgabe zu sehen, die Sie erwarten: def array1 = 0. .5. In der for-Schleife sollten Sie Integer verwenden, aber String funktioniert auch. – Danilo

Antwort

0

Am Ende ist das Problem, dass SoapUI Hauptthread tötet, bevor alle Threads die Möglichkeit haben, ihre nächste Nummer zu greifen.

Ein schneller Weg, damit zu leben, ist sleep zur Hauptmethode