[英]Smalltalk Pharo - unable to update a class instance variable in a thread
我有一個名為ThreadTesting
的類,在該類中我有一個名為'col'的實例變量(它是一個數組)。 我的目標是通過一個線程填充它,等待線程完成然后輸出其內容。
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.
輸出:
這一切都是nil
,我不知道為什么。
你的問題只是你正在定義一個將填充你的數組的塊,但你實際上並沒有用它做任何事情,即它永遠不會被調用 。
我想你想要的只是刪除那個塊周圍的額外[
和]
,然后它實際上是一段代碼被執行。 你也不需要將你的外部塊分配給一個臨時變量(如果你想保留它,請尊重Smalltalk的精神並稱之為process
,而不是pr
- AAAAB ......縮寫幾乎總是壞的。同樣,我永遠不會把一個類似col
的Array
稱為 - 這是誤導和縮寫......)。 所以你的runThread
方法應如下所示:
runThread
[
1 to: 10 do: [ :eachIndex |
numbers at: eachIndex put: eachIndex
].
semaphore signal
] fork
所以你現在聲明一個塊來填充你的數組並向你的信號量發出信號,並將它作為一個新進程分叉,而之前你聲明一個外部塊聲明了一個內部塊(但從未對它做任何事情,它只是坐在那里)並發信號通知你的信號量,然后將它作為一個新進程分叉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.