2013-08-05 57 views
0

我有這樣的代碼:此代碼對象進行了重寫,環

def updateSensor(List<String> boardIds, SensorShort sensor) { 
    for (String boardId : boardIds) { 
     println("Working on ${boardId} for ${sensor.sensorId}") 
     pool.submit({ 
      println("[${Thread.currentThread().name}] Working on ${boardId} for ${sensor.sensorId}") 

     }) 
    } 
} 

結果是:

Working on 400 for 11 
Working on 100 for 11 
Working on 101 for 11 
Working on 300 for 11 

[pool-4-thread-4] Working on 300 for 11 
[pool-4-thread-1] Working on 300 for 11 
[pool-4-thread-3] Working on 300 for 11 
[pool-3-thread-1] Working on 300 for 11 

而且是錯誤的。它接縫板卡ID對象已被重寫

回答

1

您提交的基於非決賽局部變量的工作,而不是嘗試:

def updateSensor(List<String> boardIds, SensorShort sensor) { 
    boardIds.each { String boardId -> 
     println("Working on ${boardId} for ${sensor.sensorId}") 
     pool.submit { 
      println("[${Thread.currentThread().name}] Working on ${boardId} for ${sensor.sensorId}") 
     } 
    } 
} 

與原代碼的問題是,由當時的閉包在單獨的線程上評估,循環已完成,並且本地boardId變量具有列表中最後一項的值。因此,每個作業都與最後一個元素一起運行,而不是您所需的元素。

在Java中,你將宣佈(事實上,Java的會迫使你聲明的變量final):

for(final String boardId : boardIds) { 

然而,常規不具有本地最終變量: -/

這樣做它與boardIds.each,當地boardId變量內each封閉有你需要的值...

希望解釋它嗎?

+0

謝謝,但我不知道我明白原來的代碼有什麼問題。你能解釋還是給一些鏈接? – yaroslavTir

+0

@yaroslavTir添加了更多的解釋...希望它有幫助!如果沒有,讓我知道,我會再去解釋它:-) –

+0

非常感謝你......現在很清楚:) – yaroslavTir