我是未来现代的新手,我对以下代码的期望是: 推出未来任务完成! 任务结束
但实际上,“任务结束”首先出现。 我希望函数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!")
}
答案 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
强制程序阻止,直到将来完成。