同步异步,阻塞非阻塞,在IO模型中几个概念组合在一起不是很容易理解,但是只从代码执行的角度看同步异步是很清晰的:
同步代表这段代码中的逻辑必须执行完毕,而异步代表调用马上返回,但通常情况下是获取不到需要的值。
同步:val value={
Thread.sleep(2000)
1
}
异步: val value=Future{
Thread.sleep(2000)
1
}
在scala repl执行上面代码可以发现同步等待两秒后返回结果 Int 1,而异步马上返回了
value: scala.concurrent.Future[Int] = List()。
注意:在shell中必须导入 (1)import scala.concurrent.Future 以及 (2) import scala.concurrent.ExecutionContext.Implicits.global
导入(1)是因为需要使用Future,(实际上使用了Future.apply方法),导入(2)则是由异步编程的内在逻辑决定的。
同步方法中的逻辑是由main主线程逐步执行的,而异步编程的思路是:
在执行Future.apply{异步代码块}时,主线程将异步代码块交给新的线程,新起的线程负责异步代码块的计算,而主线程则解放出来,执行下一步。
在scala的Future中,apply方法如下:
def apply[T](body: =>T)(implicit ex