2016-02-25 124 views
4

我有一个名为ThreadTesting的类,在该类中我有一个名为'col'(它是一个数组)的实例变量。我的目标是通过线程填充它,等待线程完成并输出其内容。Smalltalk Pharo - 无法更新线程中的类实例变量

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,我不知道为什么。

回答

6

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

我想你想要的只是删除围绕该块的额外[],那么它实际上是一段代码被执行。您也不需要将外部块分配给一个临时变量(如果您确实想保留它,请遵守Smalltalk的精神,并将其称为process,而不是pr - AAAAB ...缩写几乎总是不好的。 ,我绝不会打电话给Array,比如col--这是误导性的缩写......)。所以,你runThread方法应该是这样的:

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

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