您所遇到的問題是,long_task
是它做之後返回完成未來的同步功能,所有的工作。未來本身並不開始異步工作,但它只是異步通知的一個句柄。異步開始工作仍然取決於你。
對於使用與Java ExecutorService
一個FutureTask
就可以了你的例子:
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!")
}
如果你可以使用Scala的Future
,而不是Twitter的語法變得有點簡單,因爲他們已經抽象的基本線程池工作遠一點:
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)
}
注意Await
末,這是需要在這裏因爲Scala的默認ExecutorService的,今後的工作是守護線程whic h不會在運行時間到達最後一行時停止運行。 Await
強制程序阻塞,直到將來完成。
tkx爲您的答案,但它不起作用。我試圖啓動10000個異步函數,但主線程中的println出現finnaly相同。 '對象FutureTest延伸應用{ DEF long_task():未來[_] =未來{// asynchronize處理 的Thread.sleep(5000) 的println 爲( 「任務的端部」) 「」 }的函數(i < - 1至10000){ long_task() } println(「launch future task finished!」) }' – user3370374
@ user3370374我已更新答案。看起來twitter的期貨API有略微不同,希望這會更好。 –