gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:19:32 27 4
gpt4 key购买 nike

我有一个类(class)叫 ThreadTesting ,并且在该类中,我有一个名为“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.

输出:

enter image description here

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

最佳答案

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

我认为您想要的是简单地删除额外的 []在那个块周围,那么它实际上将是一段被执行的代码。您也不需要将外部块分配给临时变量(如果您确实想保留它,请尊重 Smalltalk 的精神并将其称为 process ,而不是 pr - AAAAB...缩写几乎总是很糟糕。同样,我永远不会将 Array 称为 col 之类的东西——这是误导和缩写......)。所以你的 runThread方法应如下所示:

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

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

关于Smalltalk Pharo - 无法更新线程中的类实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35639636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com