Smalltalk Pharo - 无法更新线程中的 class 实例变量

Smalltalk Pharo - unable to update a class instance variable in a thread

我有一个名为 ThreadTesting 的 class,在那个 class 中我有一个名为 'col' 的实例变量(它是一个数组)。我的目标是通过一个线程填充它,等待线程完成然后输出它的内容。

ThreadTesting new callThread.

ThreadTesting class:

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.. . 缩写几乎总是不好的。同样,我永远不会把 Array 称为 col 之类的东西——这是误导性的 缩写...)。所以你的 runThread 方法应该是这样的:

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

所以你现在声明了一个块来填充你的数组并向你的信号量发出信号,并将它作为一个新进程进行分叉,而之前你声明了一个外部块,它声明了一个内部块(但从未对它做任何事情,它只是坐在那里)并向你的信号量发出信号,然后将其作为一个新进程进行分叉。