Smalltalk Pharo - 无法更新线程中的 class 实例变量
Smalltalk Pharo - unable to update a class instance variable in a thread
我有一个名为 ThreadTesting
的 class,在那个 class 中我有一个名为 'col' 的实例变量(它是一个数组)。我的目标是通过一个线程填充它,等待线程完成然后输出它的内容。
ThreadTesting new callThread.
ThreadTesting
class:
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.
输出:
都设置成nil
不知道为什么
您的问题很简单,您正在定义一个块来填充您的数组,但您实际上并没有对它做任何事情,即它永远不会被调用。
我想你想要的是简单地删除那个块周围多余的[
和]
,然后它实际上是一段被执行的代码。您也不需要将外部块分配给临时变量(如果您确实想保留它,请尊重 Smalltalk 的精神并称其为 process
,而不是 pr
- AAAAB.. . 缩写几乎总是不好的。同样,我永远不会把 Array
称为 col
之类的东西——这是误导性的 和 缩写...)。所以你的 runThread
方法应该是这样的:
runThread
[
1 to: 10 do: [ :eachIndex |
numbers at: eachIndex put: eachIndex
].
semaphore signal
] fork
所以你现在声明了一个块来填充你的数组并向你的信号量发出信号,并将它作为一个新进程进行分叉,而之前你声明了一个外部块,它声明了一个内部块(但从未对它做任何事情,它只是坐在那里)并向你的信号量发出信号,然后将其作为一个新进程进行分叉。
我有一个名为 ThreadTesting
的 class,在那个 class 中我有一个名为 'col' 的实例变量(它是一个数组)。我的目标是通过一个线程填充它,等待线程完成然后输出它的内容。
ThreadTesting new callThread.
ThreadTesting
class:
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.
输出:
都设置成nil
不知道为什么
您的问题很简单,您正在定义一个块来填充您的数组,但您实际上并没有对它做任何事情,即它永远不会被调用。
我想你想要的是简单地删除那个块周围多余的[
和]
,然后它实际上是一段被执行的代码。您也不需要将外部块分配给临时变量(如果您确实想保留它,请尊重 Smalltalk 的精神并称其为 process
,而不是 pr
- AAAAB.. . 缩写几乎总是不好的。同样,我永远不会把 Array
称为 col
之类的东西——这是误导性的 和 缩写...)。所以你的 runThread
方法应该是这样的:
runThread
[
1 to: 10 do: [ :eachIndex |
numbers at: eachIndex put: eachIndex
].
semaphore signal
] fork
所以你现在声明了一个块来填充你的数组并向你的信号量发出信号,并将它作为一个新进程进行分叉,而之前你声明了一个外部块,它声明了一个内部块(但从未对它做任何事情,它只是坐在那里)并向你的信号量发出信号,然后将其作为一个新进程进行分叉。