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

时间:2016-02-25 22:25:14

标签: smalltalk pharo

我有一个名为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.

输出:

enter image description here

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

1 个答案:

答案 0 :(得分:6)

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

我认为你想要的只是删除该块周围的额外[],然后它实际上将是一段被执行的代码。您也不需要将外部块分配给临时变量(如果您确实要保留它,请尊重Smalltalk的精神并将其称为process,而不是pr - AAAAB ..缩写几乎总是坏的。同样,我永远不会调用像Array这样的col - 这会误导缩写......)。因此,您的runThread方法应该如下所示:

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

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