我想知道如何在squeak smalltlak中使用Threads
b1 := Ball new.
b2 := Ball new.
这2个下一个对象应该在不同的线程中一起运行(多线程)。 我怎么能这样做?
"Thread 1"
b1 start:210 at:210. "start is the name of the method"
"Thread 2"
b2 start:310 at:210.
答案 0 :(得分:6)
首先,Squeak VM仅提供绿色线程,即VM在单个进程中运行,并且线程在此单个进程内模拟。
要使用线程(在Squeak中简称为 processes ),您通常会将消息#fork
或#forkAt:
发送到块:
[ b1 start: 210 at: 210 ] fork.
[ b1 start: 210 at: 210 ] forkAt: Processor userBackgroundPriority.
除非您需要进程间通信的设施,否则它确实存在。然后,您可以将Mutex
用于关键部分(一次只能在此部分中使用一个进程)或Semaphore
来控制对共享资源的访问:
"before critical section"
self mutex critical: [ "critical section" ].
"after critical section"
"access shared resource"
self semaphore wait.
"do stuff..."
"release shared resource"
self semaphore signal.
方法#semaphore
和#mutex
只是变量的访问者。这些变量不应该懒得初始化,而 多个进程可以调用方法。这通常意味着您将使用#initialize
方法初始化它们:
initialize
semaphore := Semaphore new.
mutex := Mutex new.
原因是您不能保证不会在#ifNil:
块中暂停进程。这可能导致两个进程使用两个不同的互斥锁/信号量。
如果您需要更多信息,请查看Deep into Pharo书籍,也可以阅读Adele Goldberg的原创Smalltalk书籍(可在您最喜爱的在线书店购买)。
答案 1 :(得分:0)
当然,您应该注意threads and the UI之间的互动。
您可能不需要线程,也可以使用Morphic中的步进。