2016年9月1日 星期四

[OO 設計模式] Gossip@DesignPattern : 多執行緒模式 - Future 模式

Source From Here
Preface
考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓 的現象,所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。

Future 模式
Future 模式在請求發生時,會先產生一個 Future 物件給發出請求的客戶,而同時間,真正的目標物件之生成,由一個 新的執行緒持續進行(即 Worker Thread),真正的目標物件生成之後,將之設定至 Future 之中,而當客戶端真正需要目標物件時, 目標物件也已經準備好,可以讓客戶提取使用。


一個簡單的 Scala 程式片段示範可能像是這樣:
- Future.scala
  1. package dp.thread.future  
  2.   
  3. abstract class Future[T](var t:T=null) {    
  4.   @volatile var isReady:Boolean=false  
  5.   var self=this  
  6.   def setTarget(t:T){this.t=t}  
  7.   def getTarget():T={return t}  
  8.   def go():Unit  
  9. }  
- Main.scala
  1. package dp.thread.future  
  2.   
  3. object Main extends App {  
  4.   def timeConsumingTask(futureMsg:String, waitInSec:Int):Future[String]=  
  5.   {  
  6.     var future = new Future[String]{  
  7.       def go():Unit={  
  8.         new Thread{  
  9.           override def run {    
  10.             Thread.sleep(waitInSec*1000)  
  11.             self.setTarget(futureMsg)  
  12.             self.isReady=true               
  13.           }            
  14.         }.start()  
  15.       }  
  16.     }   
  17.     future.go()  // Start task  
  18.     return future  
  19.   }  
  20.     
  21.   printf("\t[Info] Start time consuming task...\n")  
  22.   var future1 = timeConsumingTask("Result of task1"1// Task1 need 1 second to done  
  23.   var future2 = timeConsumingTask("Result of task2"3// Task2 need 3 second to done  
  24.     
  25.   // Wait for all tasks to be done  
  26.   while(!future1.isReady || !future2.isReady)   
  27.   {  
  28.     printf("\t[Info] Wait for task...\n")  
  29.     Thread.sleep(1000)  
  30.   }  
  31.   printf("\t[Info] All tasks is done!\n")  
  32.   printf("\t\tTask1='%s'!\n", future1.getTarget())  
  33.   printf("\t\tTask2='%s'!\n", future2.getTarget())  
  34. }  
執行結果:
[Info] Start time consuming task...
[Info] Wait for task...
[Info] Wait for task...
[Info] Wait for task...
[Info] All tasks is done!
Task1='Result of task1'!
Task2='Result of task2'!


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...