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
因此,您现在声明一个块来填充数组并向信号量发送信号,并将其作为一个新进程进行分叉,而之前您声明一个外部块来声明一个内部块(但从未对其做任何操作,它只是在那里),并向信号量发送信号,然后将其作为一个新进程进行分叉