在twitter的未来,如何直接设置异步返回功能

时间:2014-03-02 09:50:19

标签: scala asynchronous future

我是未来现代的新手,我对以下代码的期望是: 推出未来任务完成! 任务结束

但实际上,“任务结束”首先出现。 我希望函数long_task中的进程能够异步运行。 我错过了什么?

import com.twitter.util.Future

object FutureTest extends App{
  def long_task(): Future[_] = { //the function of asynchronize processing
    Thread.sleep(5000)
    println("end of task")
    Future.value("")
  }

  val f = long_task()
  println("launch future task finished!")
}

2 个答案:

答案 0 :(得分:0)

以这种方式尝试(首先创建Future并执行):

import com.twitter.util.{Future, FutureTask}

object FutureTest extends App{
  def long_task(): Future[_] = new FutureTask { //the function of asynchronize processing
    Thread.sleep(5000)
    println("end of task")
    ""
  }

  val f = long_task()
  println("launch future task finished!")
}

答案 1 :(得分:0)

您遇到的问题是long_task是一个同步函数,它在完成所有工作后返回已完成的未来。未来本身并不会启动异步工作,而只是异步通知的句柄。你仍然需要异步地开始工作。

对于使用带有FutureTask的{​​{1}}的示例,可以解决这个问题:

ExecutorService

如果你可以使用scala object FutureTest extends App{ val pool: ExecutorService = Executors.newFixedThreadPool(10) def long_task(): Future[Unit] = { // create a FutureTask, which is a Callable wrapped by a Future val f = new FutureTask[Unit](new Callable[Unit]() { def call(): Unit = { Thread.sleep(5000) println("end of task") }}) // execute the callable pool.execute(f) // return the uncompleted future f } val f = long_task() println("launch future task finished!") } 而不是Twitter,那么语法会变得更简单,因为他们已经将底层的Threadpool工作抽象得更进一步:

Future

注意最后的import scala.concurrent.ExecutionContext.Implicits._ import scala.concurrent.{Await, future} import scala.concurrent.duration._ object FutureTest extends App { def long_task() = future { Thread.sleep(5000) println("end of task") } val f = long_task() println("launch future task finished!") Await.result(f,10.seconds) } ,这是因为使用scala的默认执行器服务,未来的工作是一个守护程序线程,它不会让运行时一到达最后一行就退出。 Await强制程序阻止,直到将来完成。