我正在通过学习Scala并发性 它具有以下代码。
package week_parallel.week1.SC_Book
import scala.collection.mutable
object SyncPoolArgs extends App {
private val tasks = mutable.Queue[() => Unit]()
object Worker extends Thread {
setDaemon(true)
def poll() = tasks.synchronized {
while (tasks.isEmpty) tasks.wait()
tasks.dequeue()
}
override def run() = while (true) {
val task = poll()
task()
}
}
Worker.start()
def asynchronous(body: =>Unit) = tasks.synchronized {
tasks.enqueue(() => body)
tasks.notify()
}
def sum(x: Int, y:Int) = {println("USING SUM")
x+y}
asynchronous { log("Hello ") }
asynchronous { log("World!") }
asynchronous { sum(4,5) }
Thread.sleep(500)
}
所以,我的问题是,如果我们有不带参数且不返回任何值的函数类型的任务,为什么tasks.enqueue(() => body)
将求和放入队列中,是否应该检查主体方法签名是否错误?总和。
此外,我尤其无法掌握tasks.enqueue(() => body)
如何限制为private val tasks = mutable.Queue[() => Unit]()
类型?
答案 0 :(得分:3)
我认为您可能会对声明感到困惑
body: => Unit
这意味着body
是类型Unit
的{{3}}参数。 不是并不意味着body
是一个返回Unit
(即body: () => Unit
)的函数。
“按名称传递”表示传递到body
的表达式直到需要该值时才被求值。评估后,它将返回Unit
。
由于body
的类型为Unit
,因此表达式() => body
的类型为() => Unit
,这是必需的。
在这种情况下,body
的实际值为sum(4,5)
,类型为Int
,但是Int
与Unit
兼容,因此没有错误。