我有一个名为的类ThreadTesting,在该类中我有一个名为'col'的实例变量(它是一个数组).我的目标是通过一个线程填充它,等待线程完成然后输出其内容.
ThreadTesting new callThread.
Run Code Online (Sandbox Code Playgroud)
ThreadTesting 类:
initialize
super initialize.
semaphore := Semaphore new.
col := Array new: 10.
Run Code Online (Sandbox Code Playgroud)
callThread 方法:
callThread
self runThread.
semaphore wait.
Transcript show: 'Thread finished';cr.
col do:
[ :each | Transcript show: each ; cr].
Run Code Online (Sandbox Code Playgroud)
runThread 方法:
runThread
|pr|
pr := [
[ 1 to: 10 do: [ :i |
col at: i put: i
]].
semaphore signal.
] fork.
Run Code Online (Sandbox Code Playgroud)
输出:
一切都准备就绪nil,我不知道为什么.
你的问题只是你正在定义一个将填充你的数组的块,但你实际上并没有用它做任何事情,即它永远不会被调用.
我认为你想要的只是简单地删除该块的额外[和]周围,然后它实际上将是一段被执行的代码.你也不需要将你的外部块分配给一个临时变量(如果你想保留它,请尊重Smalltalk的精神并调用它process,而不是pr--AAAAB ...缩写几乎总是坏的.同样,我倒是从来不叫Array类似col-这是误导性的和略...).所以你的runThread方法应该是这样的:
runThread
[
1 to: 10 do: [ :eachIndex |
numbers at: eachIndex put: eachIndex
].
semaphore signal
] fork
Run Code Online (Sandbox Code Playgroud)
所以你现在声明一个块来填充你的数组并发出信号,并将它作为一个新进程分叉,而之前你声明一个外部块声明了一个内部块(但从未对它做任何事情,它只是坐在那里)并发信号通知你的信号量,然后将它作为一个新进程分叉.