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

Use*_*job 4 smalltalk pharo

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

ThreadTesting new callThread.
Run Code Online (Sandbox Code Playgroud)

ThreadTesting 类:

initialize
    super initialize.
    semaphore  := Semaphore new.
    col := Array new: 10.
Run Code Online (Sandbox Code Playgroud)

callThread 方法:

callThread
    self runThread.
    semaphore wait.
    Transcript show: 'Thread finished';cr.
    col  do:
        [ :each |  Transcript show: each ; cr].
Run Code Online (Sandbox Code Playgroud)

runThread 方法:

runThread
|pr|
pr := [ 

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

     semaphore signal.
    ] fork.
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

一切都准备就绪nil,我不知道为什么.

Amo*_*ter 6

你的问题只是你正在定义一个将填充你的数组的块,但你实际上并没有用它做任何事情,即它永远不会被调用.

我认为你想要的只是简单地删除该块的额外[]周围,​​然后它实际上将是一段被执行的代码.你也不需要将你的外部块分配给一个临时变量(如果你想保留它,请尊重Smalltalk的精神并调用它process,而不是pr--AAAAB ...缩写几乎总是坏的.同样,我倒是从来不叫Array类似col-这是误导性的略...).所以你的runThread方法应该是这样的:

runThread
    [
        1 to: 10 do: [ :eachIndex |
            numbers at: eachIndex put: eachIndex
            ].
        semaphore signal
        ] fork
Run Code Online (Sandbox Code Playgroud)

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