我有一个名为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.
输出:
全部设置为nil
,我不知道为什么。
答案 0 :(得分:6)
你的问题只是你正在定义一个会填充你的数组的块,但是你实际上并没有用它做任何事情,即它永远不会被称为。
我认为你想要的只是删除该块周围的额外[
和]
,然后它实际上将是一段被执行的代码。您也不需要将外部块分配给临时变量(如果您确实要保留它,请尊重Smalltalk的精神并将其称为process
,而不是pr
- AAAAB ..缩写几乎总是坏的。同样,我永远不会调用像Array
这样的col
- 这会误导和缩写......)。因此,您的runThread
方法应该如下所示:
runThread
[
1 to: 10 do: [ :eachIndex |
numbers at: eachIndex put: eachIndex
].
semaphore signal
] fork
所以你现在声明一个块来填充你的数组并发信号你的信号量,并将它作为一个新进程分叉,而之前你声明一个外部块声明了一个内部块(但从来没有对它做任何事情,它只是坐在那里)并发信号通知你的信号量,然后把它分成一个新的过程。