2014-03-02 10 views
1

我對未來的現代新潮,我期望從下面的代碼是: 發射未來任務完成! 任務結束在twitter的未來,如何設置異步返回的功能直接

但實際上,「任務結束」首先出現。 我希望函數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

嘗試這種方式(創造未來第一和執行):

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!") 
} 
+0

tkx爲您的答案,但它不起作用。我試圖啓動10000個異步函數,但主線程中的println出現finnaly相同。 '對象FutureTest延伸應用{ DEF long_task():未來[_] =未來{// asynchronize處理 的Thread.sleep(5000) 的println 爲( 「任務的端部」) 「」 }的函數(i < - 1至10000){ long_task() } println(「launch future task finished!」) }' – user3370374

+0

@ user3370374我已更新答案。看起來twitter的期貨API有略微不同,希望這會更好。 –

0

您所遇到的問題是,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強制程序阻塞,直到將來完成。