1
我做水木清華這樣的:鑑於的Groovy /了SoapUI:環內螺紋不起作用
Iterator<String> iterator = requestList.iterator()
(1..threadCount).each {
Thread.start {
while(iterator.hasNext()) {
log.info iterator.next()
Thread.sleep(50)
}
}
}
是threadCount = 10
和requestList 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很好)
這將導致競爭條件和數據競爭以及因爲iterator對象是沒有任何同步所有線程共享。所以輸出是不可預測的。 – Madhusudhan
你偶然發現線程安全問題。相關的問題是這一個:http://stackoverflow.com/questions/5847939/is-list-iterator-thread-safe – Danilo
關於您的更新,正確定義數組以查看您所期望的輸出:def array1 = 0。 0.5。在for循環中你應該使用Integer,但String也可以。 – Danilo