object test{
object Worker1 extends Thread {
private val tasks = mutable.Queue[() => Unit]()
var terminated = false
def poll(): Option[() => Unit] = tasks.synchronized {
while (tasks.isEmpty && !terminated) tasks.wait()
if (!terminated) Some(tasks.dequeue()) else {
println("None")
None
}
}
/**
* 下面重新定义run方法,它会在模式匹配中检查poll方法是否返回Some(task)。
* 在此run方法中,不再使用while循环,而是在poll返回Some(task)时使用尾递归调用run方法。
*/
import scala.annotation.tailrec
@tailrec override def run() = poll() match {
case Some(task) => task(); run()
case None =>
}
def shutdown() = tasks.synchronized {
terminated = true
tasks.notify()
}
//Worker.start()
def asynchronous(body: =>Unit) = tasks.synchronized {
tasks.enqueue(() => body)
tasks.notify()
}
}
Worker1.start()
Worker1.asynchronous(log("Hello!"))
//这里有个问题:第二个任务World未执行,因为nitify()唤醒需要一定时间 而下一步shutdown()在在之前已经获得了锁,设置了标志位,所以未执行
Worker1.asynchronous(log("World!"))
//Thread.sleep(10)
Worker1.shutdown()
}
Scala并发编程01——结束线程方法之平滑关闭
于 2022-11-05 10:30:10 首次发布