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

Smalltalk Pharo-无法更新线程中的类实例变量,smalltalk,pharo,Smalltalk,Pharo,我有一个名为ThreadTesting的类,在该类中我有一个名为“col”的实例变量(它是一个数组)。我的目标是通过线程填充它,等待线程完成,然后输出其内容 ThreadTesting new callThread. 螺纹测试等级: initialize super initialize. semaphore := Semaphore new. col := Array new: 10. callThread方法: callThread self runTh

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

ThreadTesting new callThread.
螺纹测试
等级:

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
|pr|
pr := [ 

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

     semaphore signal.
    ] fork.
runThread
方法:

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

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

     semaphore signal.
    ] fork.
输出:


它全部设置为
nil
,我不知道为什么。

您的问题只是定义了一个将填充数组的块,但实际上您没有对它做任何操作,即它从未被调用

我认为您想要的是简单地删除该块周围的额外
[
]
,然后它实际上将是一段执行的代码。您也不需要将外部块指定给临时变量(如果你真的想保留它,请尊重Smalltalk的精神,称它为
过程
,而不是
pr
-AAAAB…缩写几乎总是不好的。同样,我也不会称
数组
类似于
col
,这是误导性的缩写…)。因此,您的
runThread
方法应该如下所示:

runThread
    [
        1 to: 10 do: [ :eachIndex |
            numbers at: eachIndex put: eachIndex
            ].
        semaphore signal
        ] fork
因此,您现在声明一个块来填充数组并向信号量发送信号,并将其作为一个新进程进行分叉,而之前您声明一个外部块来声明一个内部块(但从未对其做任何操作,它只是在那里),并向信号量发送信号,然后将其作为一个新进程进行分叉