2016-02-25 117 views
4

我有一個名爲ThreadTesting的類,在該類中我有一個名爲'col'(它是一個數組)的實例變量。我的目標是通過線程填充它,等待線程完成並輸出其內容。Smalltalk Pharo - 無法更新線程中的類實例變量

ThreadTesting new callThread. 

ThreadTesting類:

initialize 
    super initialize. 
    semaphore := Semaphore new. 
    col := Array new: 10. 

callThread方法:

callThread 
    self runThread. 
    semaphore wait. 
    Transcript show: 'Thread finished';cr. 
    col do: 
     [ :each | Transcript show: each ; cr]. 

runThread方法:

runThread 
|pr| 
pr := [ 

    [ 1 to: 10 do: [ :i | 
     col at: i put: i 
     ]]. 

    semaphore signal. 
    ] fork. 

輸出:

enter image description here

這是所有設置爲nil,我不知道爲什麼。

回答

6

你的問題很簡單,你正在定義一個塊來填充你的數組,但你實際上沒有做任何事情,即它永遠不會被稱爲

我想你想要的只是刪除圍繞該塊的額外[],那麼它實際上是一段代碼被執行。您也不需要將外部塊分配給一個臨時變量(如果您確實想保留它,請遵守Smalltalk的精神,並將其稱爲process,而不是pr - AAAAB ...縮寫幾乎總是不好的。 ,我絕不會打電話給Array,比如col--這是誤導性的縮寫......)。所以,你runThread方法應該是這樣的:

runThread 
    [ 
     1 to: 10 do: [ :eachIndex | 
      numbers at: eachIndex put: eachIndex 
      ]. 
     semaphore signal 
     ] fork 

所以你現在宣佈填充您的陣列和信號的信號塊,並分叉它作爲一個新的進程,而以前你聲明外塊宣佈了一個內部塊(但從來沒有做過任何事情,它只是坐在那裏)併發出你的信號量,然後把它分成一個新的過程。