stateless-future - 异步编程 Future


Apache
跨平台
Scala

软件简介

stateless-future 用于异步编程的纯函数风格Future

示例代码:

import scala.concurrent.duration._
import scala.util.control.Exception.Catcher
import com.qifun.statelessFuture.Future

val executor = java.util.concurrent.Executors.newSingleThreadScheduledExecutor

// Manually implements a stateless future, which is the asynchronous version of `Thread.sleep()`
def asyncSleep(duration: Duration) = new Future[Unit] {
  import scala.util.control.TailCalls._
  def onComplete(handler: Unit => TailRec[Unit])(implicit catcher: Catcher[TailRec[Unit]]) = {
    executor.schedule(new Runnable {
      def run() {
        handler().result
      }
    }, duration.length, duration.unit)
    done()
  }
}

// Without the keyword `new`, you have the magic version of `Future` constructor,
// which enables the magic postfix `await`.
val sleep10seconds = Future {
  var i = 0
  while (i < 10) {
    println(s"I have sleeped $i times.")
    // The magic postfix `await` invokes the asynchronous method `asyncSleep`.
    // It looks like normal `Thread.sleep()`, but does not block any thread.
    asyncSleep(1.seconds).await
    i += 1
  }
  i
}

// When `sleep10seconds` is running, it could report failures to this catcher
implicit def catcher: Catcher[Unit] = {
  case e: Exception => {
    println("An exception occured when I was sleeping: " + e.getMessage)
  }
}

// A stateless future instance is lazy, only evaluating when you query it.
println("Before the evaluation of the stateless future `sleep10seconds`.")
for (total <- sleep10seconds) {
  println("After the evaluation of the stateless future `sleep10seconds`.")
  println(s"I sleeped $total times in total.")
  executor.shutdown()
}

输出结果:

Before evaluation of the stateless future `sleep10seconds`.
I have sleeped 0 times.
I have sleeped 1 times.
I have sleeped 2 times.
I have sleeped 3 times.
I have sleeped 4 times.
I have sleeped 5 times.
I have sleeped 6 times.
I have sleeped 7 times.
I have sleeped 8 times.
I have sleeped 9 times.
After evaluation of the stateless future `sleep10seconds`.
I sleeped 10 times in total.