簡體   English   中英

Smalltalk Pharo - 無法更新線程中的類實例變量

[英]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 ......縮寫幾乎總是壞的。同樣,我永遠不會把一個類似colArray稱為 - 這是誤導縮寫......)。 所以你的runThread方法應如下所示:

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

所以你現在聲明一個塊來填充你的數組並向你的信號量發出信號,並將它作為一個新進程分叉,而之前你聲明一個外部塊聲明了一個內部塊(但從未對它做任何事情,它只是坐在那里)並發信號通知你的信號量,然后將它作為一個新進程分叉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM