2017-03-18 44 views
0

我有一個關於線程操作的問題,你可以幫我嗎?我如何等待後臺線程的結果,然後再顯示它?

語境:假設我們有作品的順序如下事情:

while (true) { 
    Info input = getInfo(length); 
    Result res = Calculation (input); 
    display(res); 
} 

問題我面對的是,有時,

  1. 計算(輸入)方法需要太很多時間導致嚴重的信息泄漏。
  2. 通過一切手段,計算的結果應該是 依次顯示

問題:所以,我想知道有沒有辦法讓我可以在下面執行的僞代碼?

Machine machine = new Machine(); 
    // create either a virtual machine or a thread that runs in parallel 
    machine.start(); 
    while (true) { 
     Info input = getInfo(length); 
     Work work = new Work() { 
      Result res = Calculation (input); 
      display(res); 

     machine.addWork(work); 
    } 

謝謝

回答

0

您可以提交任務的線程池調用耗時的方法Calculation(input)並行。要以與input相同的順序顯示計算結果,請使用該任務的隊列和單獨的線程。

int poolSize = Runtime.getRuntime().availableProcessors(); 
    ExecutorService pool = Executors.newFixedThreadPool(poolSize); 
    LinkedBlockingQueue<Future<Result>> queue = new LinkedBlockingQueue<>(); 
    new Thread(() -> { 
     while (true) { 
      try { 
       Result res = queue.take().get(); 
       display(res); 
      } catch (Exception e) { 
      } 
     } 
    }).start(); 
    while (true) { 
     final Info input = getInfo(length); 
     Future<Result> res = pool.submit(() -> { 
      return Calculation(input); 
     }); 
     queue.put(res); 
    } 
+0

謝謝。它應該可以工作:D – DitoMaF

+1

爲什麼在你有一個線程池時啓動一個新線程? – Gray

+0

你提交runnables到線程池 – efekctive

相關問題