2016-04-19 13 views
1

我做水木清華這樣的:鑑於的Groovy /了SoapUI:環內螺紋不起作用

Iterator<String> iterator = requestList.iterator() 

    (1..threadCount).each { 

     Thread.start { 

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

threadCount = 10requestList is ~115,我希望所有的線程輸出的所有列表中,每次迭代器要求給他們下一個。

不過,我幾乎連得10個日誌,通常8

代替log.info其實我打算觸發與數N的REST請求一切了SoapUI Groovy腳本的步驟中完成的,

我在做什麼這些線程有問題?

UPD

好吧,沒水木清華笨的像這樣,爲了測試(和避免使用一個數組):

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 
    } 
} 

現在我根本沒有輸出或一個日誌最多,雖然我期望12. 如何創建將同時輸出數據的線程?

def threadCount=10 

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

Thread.start { 

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

輸出是:

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 

僅此而已。再說一遍,我或者常規怎麼了? (希望groovy很好)

+1

這將導致競爭條件和數據競爭以及因爲iterator對象是沒有任何同步所有線程共享。所以輸出是不可預測的。 – Madhusudhan

+0

你偶然發現線程安全問題。相關的問題是這一個:http://stackoverflow.com/questions/5847939/is-list-iterator-thread-safe – Danilo

+0

關於您的更新,正確定義數組以查看您所期望的輸出:def array1 = 0。 0.5。在for循環中你應該使用Integer,但String也可以。 – Danilo

回答

0

最後,問題是SoapUI殺死主線程之前所有的線程有機會抓住他們的下一個號碼。

一個快速的方法來住在一起,這是添加sleep主方法