Source From Here
Preface
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。
Future 模式
Future 模式在請求發生時,會先產生一個 Future 物件給發出請求的客戶,而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行(即 Worker Thread),真正的目標物件生成之後,將之設定至 Future 之中,而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以讓客戶提取使用。
一個簡單的 Scala 程式片段示範可能像是這樣:
- Future.scala
- Main.scala
執行結果:
Preface
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。
Future 模式
Future 模式在請求發生時,會先產生一個 Future 物件給發出請求的客戶,而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行(即 Worker Thread),真正的目標物件生成之後,將之設定至 Future 之中,而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以讓客戶提取使用。
一個簡單的 Scala 程式片段示範可能像是這樣:
- Future.scala
- package dp.thread.future
- abstract class Future[T](var t:T=null) {
- @volatile var isReady:Boolean=false
- var self=this
- def setTarget(t:T){this.t=t}
- def getTarget():T={return t}
- def go():Unit
- }
- package dp.thread.future
- object Main extends App {
- def timeConsumingTask(futureMsg:String, waitInSec:Int):Future[String]=
- {
- var future = new Future[String]{
- def go():Unit={
- new Thread{
- override def run {
- Thread.sleep(waitInSec*1000)
- self.setTarget(futureMsg)
- self.isReady=true
- }
- }.start()
- }
- }
- future.go() // Start task
- return future
- }
- printf("\t[Info] Start time consuming task...\n")
- var future1 = timeConsumingTask("Result of task1", 1) // Task1 need 1 second to done
- var future2 = timeConsumingTask("Result of task2", 3) // Task2 need 3 second to done
- // Wait for all tasks to be done
- while(!future1.isReady || !future2.isReady)
- {
- printf("\t[Info] Wait for task...\n")
- Thread.sleep(1000)
- }
- printf("\t[Info] All tasks is done!\n")
- printf("\t\tTask1='%s'!\n", future1.getTarget())
- printf("\t\tTask2='%s'!\n", future2.getTarget())
- }
沒有留言:
張貼留言